这是我的正则表达式:
^([\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
标志的匹配项。
谁能解释一下为什么会发生这种情况?
问题是最后一部分还是你的表情
^([\p{L}]+\.?)(?:[-\s']?[\p{L}]+)*$
^^^^^^^^
因为您使用的是 unicode 字符,并且还使用了多行标志
/gm
那么正则表达式的这一部分也匹配新行,后跟名称中的任何其他有效字符
为了避免这种情况,您可以告诉正则表达式在使用 负后视 匹配该表达式段之前显式避免换行,如下所示:
^([\p{L}]+\.?)(?:[-\s']?(?<!\n)[\p{L}]+)*$
注意添加了
(?<!\n)
。这告诉引擎在比赛的这一部分之前不能有新行
请参阅下面的工作示例或游乐场这里 顺便说一句,我向您推荐这个播放和调试正则表达式的链接站点。