Javascript正则表达式负提前匹配

时间:2018-11-20 17:48:56

标签: javascript regex

我在正则表达式上很烂。我有以下表达式:

(?!.*\")(Level)(\s)([0-9])(?!.*\")

我想使用此表达式用查询将所有2级替换为“ 2级”。问题是该正则表达式捕获"Level 2(不关闭")。我只想抓住Level 2,只要它必须在单词前后加上引号即可。

做到这一点的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

如果您只想捕获每次出现的Level\s+\d+并用"Level\s+\d+"替换,前提是它没有被双方的双引号引起来,则可以尝试使用此正则表达式,

([^"]|^)(Level\s+\d+)([^"]|$)

并替换为

\1"\2"\3

Check here for a demo

这将不会选择要替换类型Label 2""Label 2"Label 2"的文本,并且仅当Label 2替换为两边都没有双引号时才替换

答案 1 :(得分:0)

您可以使用

var s = '"Level 3 protected": Level 4 here and "another Level 5"';
s = s.replace(/(^|[^"])(Level\s+\d+)(?!["\d])/g, '$1"$2"');
console.log(s);

详细信息

  • (^|[^"])-第1组($1):字符串的开头或除双引号之外的任何字符
  • (Level\s+\d+)-第2组($2):Level,1+个空格,1 +个数字
  • (?!["\d])-当前位置的左侧不允许使用数字或双引号。

请参见regex demo

答案 2 :(得分:0)

不确定是否要替换"Level 2Level 2",因此我为两种方案提供了解决方案:

1) 如果您只想替换连一个"都没有的内容:

(?<!")(Level\s\d+)(?!")

请参阅https://regex101.com/r/Nc7b5h/1

这使用负向后看和负向前看


2) 但是,如果您也只想替换为一个 ",请尝试以下操作:

(?!"Level\s\d+")(?<!")"?Level\s\d+"?

https://regex101.com/r/qL5Li5/1/

根据是否要替换单个"来设置匹配组:

var s='This "Level 2" is "Level 2 a Level 2" test Level 2 :)'
​
s.replace(/(?!"Level\s\d+")(?<!")"?(Level\s\d+)"?/g, '"$1"');

//> 'This "Level 2" is "Level 2" a "Level 2" test "Level 2" :)'

var s='This "Level 2" is "Level 2 a Level 2" test Level 2 :)'

s.replace(/(?!"Level\s\d+")(?<!")("?Level\s\d+"?)/g, '"$1"');

//> 'This "Level 2" is ""Level 2" a "Level 2"" test "Level 2" :)'

这里的窍门是,首先对禁止与 two "进行比赛的情况进行否定的前瞻,然后再执行其他操作。

一般说明

如果您不想使用后向表达式((?<!")),因为较旧的浏览器(ES2018之前的版本)将不支持该表达式,请使用(^|[^"]),如其他建议的那样。只是不要忘记在替换中恢复其内容:)

例如s.replace(/(?!"Level\s\d+")(^|[^"])"?(Level\s\d+)"?/g, '$1"$2"');