这个问题在这里已有答案:
我有一个像这样的字符串:
Hello [@foo] how are you [@bar] more text
最终我需要修改匹配/\[@.+?\]/
的子串的每个实例,但我还需要在[@foo]
和[@bar]
之前/之后修改每个子串。
以下正则表达式匹配[@.+]
之前的子字符串,[@.+]
本身,然后是[@.+]
之后的子字符串,直到下一个字符后跟另一个[@.+]
。
(.*?)(\[(@.+?)\])((.(?!(\[@.+?\])))*)
所以第一场比赛是“你好[@foo]你好吗”,第二场比赛是“[@bar]更多文字”。
注意第二场比赛开始时的空格。那就是问题所在。有没有办法让第一场比赛包括所有角色直到下一个[@.+]
?
我的正则表达式包括在[@.+]
之后没有跟随[@.+]
实例的字符,我看不出任何方式让它包含所有字符,直到我们实际上在另一个[@.+]
实例中。
我真的很想知道我是否遗漏了某些东西 - 当然感觉应该有更简单的方法来捕捉给定匹配的字符,或者更简单的方法来捕捉不属于匹配的字符......
你有这个正则表达式:
(.*?)(\[(@.+?)\])((.(?!(\[@.+?\])))*)
^
看那个点。它先于负向前瞻。仅当满足负前瞻时,它才匹配数据单位。如果否定前瞻失败,则点将不匹配。在匹配\[@.+?\]
之前,这发生在角色上。因此,不包括空格字符。
要包含它,您只需更改订单即可。在负向前瞻传递之后放置点:
(.*?)(\[(@.+?)\])(((?!(\[@.+?\])).)*)
^
如果我理解正确,您希望将文本分成组,每个组都有一个[@.+]
实例,并且所有文本必须匹配到一个组中。
This RegEx可能会帮助你获得这些变量。
(?:\[@[A-Za-z0-9]+\])
您还可以向[A-Za-z0-9]
添加任何其他字符,例如。,+,@:
`[A-Za-z0-9\.\+\@]`
并根据需要进行更改:
(?:\[@[A-Za-z0-9\.\+\@]+\])
x = 'Hello [@foo] how are you [@bar] more text'
out = re.search('((.*)(\[.*\])(.*))((\[.*\])(.*))',x)
获得上面的输出后,您可以使用groups方法访问不同的组:
out.group(1)
'你好[@foo]你好吗?
out.group(2)
'你好 '
out.group(3)
'[@foo]'
out.group(4)
' 你好吗 '
out.group(5)
'[@bar]更多文字'
out.group(6)
'[@酒吧]'
out.group(7)
'更多文字'