我一直在使用一些正则表达式,但我遇到了一个问题。
我需要对以下模式运行替换:
字符串必须有\ E \但不能以\ .br或\ R开头
示例文字:
Random\E\Text - should match
\E\Text - should match
\R\E\.br\ - should not match
\.br\E\R\ - should not match
有人能建议一种能够实现这一目标的模式吗?
我只尝试了\ .br案例和
/[^\b\\\.br\b]\E\/g
有充分理由失败,以下模式似乎也无效:
/(?!\\\.br)\E\/g
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:0)
您可以尝试(\\.br|\\R)\\E(\\.br|\\R)
Javascript不支持lookbehinds,但你应该能够否定一个匹配(如果!匹配,字符串有效)。
工作示例:http://regex101.com/r/hL3wN5
var str = "Random\\E\\Text";
if (!(/(\\.br|\\R)\\E(\\.br|\\R)/g).test(str))
//do stuff because it doesn't test true
答案 1 :(得分:0)
不幸的是,JavaScript不支持lookbehinds,只支持lookaheads。但是,一切都不会丢失!您可以使用替换功能:
input.replace( /(...|..|.|$)\\E\\/, function( match, prefix ) {
if( prefix==='\.br' || prefix.match( /\\R$/ ) )
return match; // return match unaffected
else
return prefix + '<\\E\\ replacement>';
});
我通常发现很多正则表达式问题都可以通过这种方法解决:而不是在一个巨大的正则表达式中做所有事情,将其分解为可管理的块,并执行多个正则表达式。
这里发生的是交替运算符用于查找以下模式(按顺序):
...\\E\\ (catch potential instance of \.br\E\)
..\\E\\ (catch potential instance of \R\E\)
.\\E\\ (catch \E\ if it's at index 1 in the string)
$\\E\\ (catch \E\ if it's at index 0 in the string)
一旦你发现了所有这些可能性,你就可以检查\E\
之前拾取的内容。如果是\.br
或\R
,则只返回整个匹配项(包括之前的字符)。如果是其他任何内容,您可以返回前缀,然后替换\E\
。
我希望这种解释有意义!
答案 2 :(得分:0)
也许这个
# /^(?=.*\\E\\)(?!.*\\\.br\\E\\)(?!.*\\R\\E\\).+$/
^
(?= .* \\E\\ )
(?! .* \\\.br\\E\\ )
(?! .* \\R\\E\\ )
.+ // can be excluded if just a test
$ // can be excluded if just a test
编辑如果该测试匹配,则以简单快速的方式运行/\\E\\/g
的全局替换。