我想要做的是,如果一个字符串由一个以"!“开头的子字符串组成。封装在"“和"”中,以便通过空格将这些括号与字符串的其余部分分开,例如" !foo“->”!foo“、" !bar”->“!bar”等等。因为该子字符串可以是可变长度的,所以我认为这必须用regex来完成。我的想法是分两个步骤-首先分离第一个括号,然后分开第二个括号。
第一个并不难;正则表达式只是\[!,所以我可以在Javascript中做str = str.replace(/\[!/g, "[ !");。这是我无法工作的第二部分。
因为现在,我需要匹配"]“如果字符串文字"[!!”在它之前的任何地方都能找到。因此,简单的正向后视不匹配,因为它只直接看后面:(?<=\Q[ !\E)\]不匹配。
我仍然不明白为什么,但我不允许在非固定长度的情况下进行正向查找;(?<=\Q[ !\E.*)\]将错误Syntax Error: Invalid regular expression: missing /抛到控制台中,而这个regex调试器生成一个模式错误,解释“查找后面的量词使其非固定宽度”。
在查找和捕获组之间放置一个非固定宽度的非捕获组不工作;(?<=\Q[ !\E)(?:.*)\]不匹配。
有一件事是行不通的,那就是试着去匹配“!”在字符串的开头,因为这个"!foo“字符串本身实际上是一个更大的字符串的子字符串,而不是开头。
我遗漏了什么?
发布于 2020-02-01 21:15:58
使用两个正面的外观,您可以断言左边的是一个开放的方括号(?<=\[)。
然后匹配除]以外的任何字符,使用一个带有感叹号的否定字符类 ![^[\]]+,并断言右边的是使用(?=])的结束方括号。
注意,在Javascript中,查找还没有得到广泛的支持。
(?<=\[)![^[\]]+(?=])在替换中使用匹配的子字符串$&
[
"[!foo]",
"[!bar]"
].forEach(s =>
console.log(s.replace(/(?<=\[)![^[\]]+(?=])/g, " $& "))
)
或者您也可以使用3个捕获组来代替:
(\[)(![^\]]+)(\])在替换用途
$1 $2 $3
[
"[!foo]",
"[!bar]"
].forEach(s =>
console.log(s.replace(/(\[)(![^\]]+)(\])/g, "$1 $2 $3"))
)
发布于 2020-02-01 21:16:25
您可以使用这个regex:\[!([^]]+)\]和这个替换字符串[! \1 ]。
解释
裁判官:
\[!:比赛开始于[!([^]]+):在第1组中捕获所有不是的字符]\]:匹配]替换:用[!{]组的内容替换完全匹配。
希望能帮上忙。
https://stackoverflow.com/questions/60021105
复制相似问题