Javascript正则表达式:在相同模式中匹配和不匹配的混合

时间:2013-12-03 23:33:47

标签: javascript regex

我一直在使用一些正则表达式,但我遇到了一个问题。

我需要对以下模式运行替换:

字符串必须有\ 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

任何帮助都将不胜感激。

感谢。

3 个答案:

答案 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的全局替换。