【问题标题】:RegExp to replace exact OR similar word JS正则表达式替换精确或相似的词 JS
【发布时间】:2020-04-19 17:37:28
【问题描述】:

我正在努力使用正则表达式来替换字符串中的变量名称...

我需要将某些变量名放在引号之外,并且,如果该变量有一个限定符(如属性或方法),这个限定符也需要在最终字符串中的引号之外。

所以,给出这个例子:

cExp = new RegExp('oErro', 'g');
cMsg = "Error ocurred: oErro; please try again";
cMsg.replace(cExp, '\' + oErro + \'')

输出正是我所期望的:

'发生错误:' + oErro + ';请再试一次'

我搜索了如何在变量名之后包含任何单词,并最终得到了这段代码:

cExp = new RegExp('oErro(\.[^\ |^\;|^\,|^\)|^\}]*)', 'g');
cMsg = "Error ocurred: oErro.message; please try again";
cMsg.replace(cExp, '\' + oErro$1 + \'')

结果正是我所期望的:

'发生错误:' + oErro.message + ';请再试一次'

到目前为止,一切都很好。 但是,如果我将变量名与 variable.qualifier 混合使用,事情就会变得一团糟:

cExp = new RegExp('oErro(\.[^\ |^\;|^\,|^\)|^\}]*)', 'g');
cMsg = "Error ocurred: oErro.message (complete message: oErro)";
cMsg.replace(cExp, '\' + oErro$1 + \'')

我得到这个输出

'发生错误:' + oErro.message + '(完整消息:' + oErro)+ ''

虽然我期望这个输出(注意引号内的括号)

'发生错误:' + oErro.message + '(完整消息:' + oErro + ')'

换句话说,每次使用不带限定符的“oErro”时,表达式都会获取下一个单词并在封闭引号之外与 oErro 连接。

当然我做错了什么,但我对 RegExp 不是很熟悉,并且可能没有使用正确的术语进行搜索以获得适当的帮助。

我需要的是一个适用于两种情况的表达式(从最终字符串的引号中删除单词“oErro”或语法“oErro.something”)...

在此先感谢,对糟糕的英语感到抱歉,我尝试举一些例子,但如果您需要更多关于我需要实现的目标的详细信息,请随时询问。

【问题讨论】:

  • 尝试cExp = /oErro(?:\.\w+)?/gcExp=/oErro(?:\.[^\s;,)}]+)?/g 然后你需要使用.replace(cExp, '\' + $& + \'')
  • @WiktorStribiżew 就像一个魅力!如何将此评论标记为答案?老实说,我不明白如何或为什么:在我看来,问号在搜索词之后变成了可选的点和单词(括号内),但我会搜索冒号的含义,因为我不清楚...非常感谢!
  • 在下面查看我的答案,我添加了一些详细信息和有用的链接。很高兴它对你有用。

标签: javascript regex


【解决方案1】:

你可以使用

cExp=/oErro(?:\.[^\s;,)}]+)?/g
// Or, if the chars after `.` can only only be letters/digits/underscore
cExp = /oErro(?:\.\w+)?/g

然后,你需要使用

cMsg.replace(cExp, '\' + $& +  \'')

其中$& 是对整个匹配值的反向引用。

模式详情

  • oErro - 文字字符串
  • (?:\.\w+)? - 一个可选的(由于 ? 在末尾)non-capturing group 匹配 1 或 0 次出现
    • \. - 一个点 -\w+ - 1+ 个字母/数字/下划线
    • [^\s;,)}]+ - 1 个或多个字符,而不是空格、;,)}

【讨论】:

  • 这个cExp=/oErro(?:\.\w+)?/g和这个cErro = "oErro"; cExp = new RegExp(cErro + "(?:\.\w+)?", "g")在JavaScript中有什么区别吗?使用一个或另一个时结果完全不同......虽然第一个给了我Error ocurred: ' + oErro.message + ' (complete message: ' + oErro + '),第二个奇怪地给了我Error ocurred: ' + oErro + '.message (complete message: ' + oErro + ')...
  • @SidneiPaixao 要在简单的字符串文字中引入反斜杠,您需要使用"\\"。所以,你需要cExp = new RegExp(cErro + "(?:\\.\\w+)?", "g")。如果您使用最新的 ECMAScript 标准,请使用原始字符串文字,cExp = new RegExp(String.raw`${cErro}(?:\.\w+)?`, "g")
  • 完全忘记了双反斜杠!抱歉...调整了我的代码,现在它工作正常...也许该睡觉了,或者喝杯咖啡...
【解决方案2】:

相信在您的正则表达式中使用the \w character 可以满足您捕获属性或方法名称的要求。

oErro

cMsg = "Error ocurred: oErro; please try again";
cMsg.replace(/(oErro(\.\w+)?)/g, '\' + $1 + \'');
// Output: "Error ocurred: ' + oErro + '; please try again"

oError.message

cMsg = "Error ocurred: oErro.message (complete message: oErro)";
cMsg.replace(/(oErro(\.\w+)?)/g, '\' + $1 + \'');
// Output: "Error ocurred: ' + oErro.message + ' (complete message: ' + oErro + ')"

【讨论】:

  • 这与第一个答案略有不同,但也适用于我......谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2017-09-09
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多