重音字符和正则表达式

3

我有这个正则表达式:

(\b)(emozioni|gioia|felicità)(\b)

In a string like the one below:

emozioni emozioniamo felicità felicitàs

它应该匹配第一个和第三个单词。但实际上它匹配了第一个和最后一个。我猜是因为有重音字符的缘故。我尝试了这种替代方案:

(\b)(emozioni|gioia|felicità\s)(\b)

但是它只会匹配“felicità”,前提是它后面有另一个单词。因此,为了更具体,仅当它出现在这种情况下才能匹配:
emozioni emozioniamo felicità felicitàs

而不是在这个里面:

emozioni emozioniamo felicitàs felicità

我找到了一篇关于法语重音字符(即在单词开头)的文章,链接在这里,我按照第二个答案进行了操作。如果有更好的解决方案,请不吝赐教。


很高兴见到你,瓦莱里奥。你有“意大利式”的解决方案吗? - softwareplay
1
他们已经提供了一些解决方案,我想知道为什么不将其拆分为数组而不是使用正则表达式 :) 但我不知道情况如何。 - Valerio Cicero
2个回答

2
一个单词边界\b仅适用于属于\w字符类的字符,即[0-9a-zA-Z_],因此,您不能在像à这样带有重音符号的字符后面放置\b
您可以使用前瞻解决您的问题:
felicità(?=\s|$)

或简短些:

felicità(?!\S)

(或者使用@Sniffer建议的\W代替\s,但是你可能会匹配到类似felicitàà这样的内容)

@softwareplay,请检查我发布的演示链接,它可以正常工作。 - Ibrahim Najjar

1
尝试以下替代方案:
\b(emozioni|gioia|felicità)(?=\W|$)

这将匹配你列出的任何单词,只要这些单词之一紧随着一个非单词字符\W或字符串结尾$即可。

Regex101演示


1
@softwareplay 如果你不是被强制使用\b,那么不用担心,无论你在列表中放入什么单词,这都可以工作。 - Ibrahim Najjar
@Sniffer 考虑到JS不支持向后查找,你有没有解决以重音字符开头的单词的方案? - UncleZen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接