RegEx:在下一场比赛之前我如何匹配所有角色? [重复]

问题描述 投票:1回答:4

我有一个像这样的字符串:

Hello [@foo] how are you [@bar] more text

最终我需要修改匹配/\[@.+?\]/的子串的每个实例,但我还需要在[@foo][@bar]之前/之后修改每个子串。

以下正则表达式匹配[@.+]之前的子字符串,[@.+]本身,然后是[@.+]之后的子字符串,直到下一个字符后跟另一个[@.+]

(.*?)(\[(@.+?)\])((.(?!(\[@.+?\])))*)

所以第一场比赛是“你好[@foo]你好吗”,第二场比赛是“[@bar]更多文字”。

注意第二场比赛开始时的空格。那就是问题所在。有没有办法让第一场比赛包括所有角色直到下一个[@.+]

我的正则表达式包括在[@.+]之后没有跟随[@.+]实例的字符,我看不出任何方式让它包含所有字符,直到我们实际上在另一个[@.+]实例中。

我真的很想知道我是否遗漏了某些东西 - 当然感觉应该有更简单的方法来捕捉给定匹配的字符,或者更简单的方法来捕捉不属于匹配的字符......

regex regex-negation regex-lookarounds
4个回答
3
投票

你有这个正则表达式:

(.*?)(\[(@.+?)\])((.(?!(\[@.+?\])))*)
                   ^

看那个点。它先于负向前瞻。仅当满足负前瞻时,它才匹配数据单位。如果否定前瞻失败,则点将不匹配。在匹配\[@.+?\]之前,这发生在角色上。因此,不包括空格字符。

要包含它,您只需更改订单即可。在负向前瞻传递之后放置点:

(.*?)(\[(@.+?)\])(((?!(\[@.+?\])).)*)
                                 ^

live demo here


1
投票

如果我理解正确,您希望将文本分成组,每个组都有一个[@.+]实例,并且所有文本必须匹配到一个组中。

试试(?:^.*?)?\[@.+?\].*?(?=\[|$)


0
投票

This RegEx可能会帮助你获得这些变量。

(?:\[@[A-Za-z0-9]+\])

您还可以向[A-Za-z0-9]添加任何其他字符,例如。,+,@:

`[A-Za-z0-9\.\+\@]` 

并根据需要进行更改:

(?:\[@[A-Za-z0-9\.\+\@]+\])

enter image description here


0
投票
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)

'更多文字'

© www.soinside.com 2019 - 2024. All rights reserved.