我在正则表达式上很烂。我有以下表达式:
(?!.*\")(Level)(\s)([0-9])(?!.*\")
我想使用此表达式用查询将所有2级替换为“ 2级”。问题是该正则表达式捕获"Level 2
(不关闭"
)。我只想抓住Level 2
,只要它必须在单词前后加上引号即可。
做到这一点的最佳方法是什么?
答案 0 :(得分:0)
如果您只想捕获每次出现的Level\s+\d+
并用"Level\s+\d+"
替换,前提是它没有被双方的双引号引起来,则可以尝试使用此正则表达式,
([^"]|^)(Level\s+\d+)([^"]|$)
并替换为
\1"\2"\3
这将不会选择要替换类型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 2
和Level 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"');