[我正在尝试做的是,如果字符串由以“!”开头的子字符串组成,封装在[[]和“]”中,以通过空格将那些括号与字符串的其余部分分开,例如“ [!foo]”->“ [!foo]”,“ [!bar]”->“ [!bar]”,等等。由于该子字符串可以是可变长度,所以我认为必须使用正则表达式。我的想法是分两个步骤进行操作-首先分开第一个括号,然后分开第二个括号。
第一个不难;正则表达式只是\[!
,所以我可以用Java语言执行str = str.replace(/\[!/g, "[ !");
。这是我无法工作的第二部分。
因为现在,如果字符串字面量为“ [!”,我需要匹配“]”在anywhere之前找到。因此,简单的正向后视不匹配,因为它仅向后显示[[direct]]:(?<=\Q[ !\E)\]
不匹配。而且我仍然不明白为什么,但是我不允许在非固定长度后面加上正数; (?<=\Q[ !\E.*)\]
在控制台中引发错误Syntax Error: Invalid regular expression: missing /
,并且this regex debugger产生模式错误,解释为“后向内部的量词使宽度不固定”。
在后视和捕获组之间放置宽度不固定的非捕获组不起作用; (?<=\Q[ !\E)(?:.*)\]
不匹配。
[一件不起作用的事情就是尝试匹配“ [!”在字符串的开头,因为整个“ [!foo]”字符串实际上是
itself
甚至更大的字符串的子字符串,并且不在开头。我想念什么?[我正在尝试做的是,如果字符串由以“!”开头的子字符串组成,封装在[[]和“]”中,以通过空格将那些括号与字符串的其余部分分开,例如“ [!foo]”-> ...
\[!([^]]+)\]
与此替换字符串[! \1 ]
一起使用。