Javascript RegExp替换确切的或类似的单词JS

Javascript RegExp替换确切的或类似的单词JS,javascript,regex,Javascript,Regex,我正在努力用正则表达式替换字符串中变量的名称 我需要将某些变量名放在引号外,如果该变量有一个限定符(如属性或方法),则该限定符也需要放在最后一个字符串的引号外 因此,举个例子: 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; 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 + \'')
结果正是我期望看到的:

'出现错误:'+oError.message+';请再试一次'

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

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

'出现错误:'+oError.message+'(完整消息:'+oError)+''

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

“出现错误:'+oError.message+'(完整消息:'+oError+')”

换句话说,每次在没有限定符的情况下使用“oErro”时,表达式都会获取下一个单词,并在引号外与oErro连接

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

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

提前感谢并为糟糕的英语感到抱歉,我试着举一些例子,但请随意询问您是否需要更多关于我需要实现的目标的详细信息。

您可以使用

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

cMsg.replace(cExp, '\' + $& +  \'')
其中,
$&
是对整个匹配值的反向引用

图案细节

  • oError
    -文字字符串
  • (?:\。\w+)
    -一个可选选项(由于结尾处出现了
    ),它匹配
    • \。
      -一个点 -
      \w+
      -1+字母/数字/下划线
    • [^\s;,)}]+
      -1个或多个字符,而不是空格,
      }
我相信通过在正则表达式中使用,可以满足捕获属性或方法名称的要求

oError

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 + ')"

尝试
cExp=/oError(?:\.\w+)/g
cExp=/oError(?:\.[^\s;,)}+)?/g
然后您需要使用
。替换(cExp,“\'+$&+\”
@WiktorStribiż!如何将此评论标记为答案?老实说,我不明白怎么做,也不明白为什么:在我看来,问号在搜索词后面变成了点和单词(括号内),但我会搜索冒号的含义,因为我不清楚。。。非常感谢你!见下面我的答案,我添加了一些细节和有用的链接。很高兴它对你有用。这与第一个答案略有不同,但对我也有用。。。非常感谢。这个
cExp=/oErro(?:\.\w+)/g
和这个
cErro=“oErro”之间的JavaScript有任何区别;cExp=newregexp(cErro+“(?:\。\w+”,“g”)
?使用一个或另一个时,结果是完全不同的。。。。第一个给我
出错:'+oError.message+'(完整消息:'+oError+')
,第二个给我
出错:'+oError+'.message(完整消息:'+oError+')
。@SidneiPaixao要在简单的字符串文字中引入反斜杠,需要使用
“\\”
。因此,您需要
cExp=newregexp(cErro+“(?:\\.\\w+”,“g”)
。如果您使用最新的ECMAScript标准,请使用原始字符串文本,
cExp=new RegExp(string.raw`${cErro}(?:\。\w+,“g”)
完全忘记了双反斜杠!对不起。。。调整了我的代码,现在运行良好。。。也许该睡觉了,或者喝杯咖啡。。。