regex在后台做什么?

regex在后台做什么?,regex,Regex,我今天和regex玩了一圈,我踩到了一个我真的不明白它为什么会这样的东西 这是我的工作正则表达式(我将其格式化以提高可读性): 有了这个正则表达式,它会工作得很好。但是以前,集团街道之前的\n是可空的,而不是集团公司之前的\n。问题是有一种情况,字符串中没有同伴。上一个版本的结果是:最后一个字符的整个街道都在集团公司中,街道的最后一个字符在集团街道中(我使用regex101进行测试)。虽然groupcompany可以为空,但看起来它“被迫”成为字符串的一部分,这显然不是我想要的 这就是我的问题所

我今天和regex玩了一圈,我踩到了一个我真的不明白它为什么会这样的东西

这是我的工作正则表达式(我将其格式化以提高可读性):

有了这个正则表达式,它会工作得很好。但是以前,集团
街道
之前的
\n
是可空的,而不是集团
公司
之前的
\n
。问题是有一种情况,字符串中没有同伴。上一个版本的结果是:最后一个字符的整个街道都在集团
公司
中,街道的最后一个字符在集团
街道
中(我使用regex101进行测试)。虽然group
company
可以为空,但看起来它“被迫”成为字符串的一部分,这显然不是我想要的

这就是我的问题所在。正则表达式在后台是如何工作的?我认为正则表达式试图从字符串中所有可能的分组中找出最佳的解决方案。但我不知道为什么它认为这个解决方案是最好的


这里有一个指向regex101的链接,您可以在其中查看它以前的行为:

您可以打开regex101中的调试器,查看获取匹配项的具体步骤。在本例中,正则表达式匹配贪婪,因此尝试从左到右尽可能多地匹配,然后在必要时逐字符跟踪以获得匹配。@SebastianProske感谢您的提示。我不知道regex101有一个调试器。旁注:你在角色类中转义太多了。只有<代码> 和<代码> -/COD>在类的中间,在这个上下文中有特殊含义,如果要引用它们的文字字符,则需要转义。第一行最后一个字符的空格也一样:不需要转义,它没有特殊意义,默认情况下会按字面匹配。可能是
(?<name>[a-z\ ]+[a-zA-Z]+|[a-zA-Z]+)\ 
(?<firstname>[a-z-A-Z\ ]+)\n
(?<title>[a-zA-Z\.\ ]+)\n?
(?<company>[a-zA-Zäöü\.\ ]+)?\n
(?<street>[a-zA-Zäöü]+)\ (?<housenumber>[0-9]+)\n?
(?<postfach>Postfach [0-9]+)?\n
(?<zip>[0-9]+)\ (?<place>[a-zA-Zäöü]+)
Smith John
Dr.
Foobar AG
Smithstrasse 1
Postfach 1
6500 Bellinzona