`Ungreedy` 标志是否需要匹配到 $ 行末尾?

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

这是我的正则表达式:

^([\p{L}]+\.?)(?:[-\s']?[\p{L}]+)*$
我想用它来匹配城市名称。

带测试弦:

Travelers Rest
San Francisco
Three word city
abc-bbc
St. Catharines
xx's city
San Fransisco
Val-d'Or
Presqu'ile
Niagara on the Lake
Niagara-on-the-Lake
München
toronto
toRonTo
villes du Québec
Provence-Alpes-Côte d'Azur
Île-de-France
Kópavogur
Garðabær
Sauðárkrókur
Þorlákshöfn
上海
東京

它只找到两个没有

Ungreedy
标志的匹配项。

谁能解释一下为什么会发生这种情况?

enter image description here

regex
1个回答
0
投票

问题是最后一部分还是你的表情

^([\p{L}]+\.?)(?:[-\s']?[\p{L}]+)*$
                        ^^^^^^^^

因为您使用的是 unicode 字符,并且还使用了多行标志

/gm
那么正则表达式的这一部分也匹配新行,后跟名称中的任何其他有效字符

为了避免这种情况,您可以告诉正则表达式在使用 负后视 匹配该表达式段之前显式避免换行,如下所示:

^([\p{L}]+\.?)(?:[-\s']?(?<!\n)[\p{L}]+)*$

注意添加了

(?<!\n)
。这告诉引擎在比赛的这一部分之前不能有新行

请参阅下面的工作示例或游乐场这里 顺便说一句,我向您推荐这个播放和调试正则表达式的链接站点。

Working example

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