正则表达式:\w - "_" + "-" 在UTF-8中的含义

14

我需要一个正则表达式来匹配UTF-8字母和数字、破折号(-),但不匹配下划线(_)。我尝试了以下这些无效的正则表达式:

  • ([\w-^_])+
  • ([\w^_]-?)+
  • (\w[^_]-?)+

\w[A-Za-z0-9_] 的速记符号,但如果设置了 u 修饰符,它也会匹配UTF-8字符。

有人能帮我解决这个问题吗?


1
请明确“UTF-8字母”的含义 - 您确认您不仅需要英文字符吗? - meder omuraliev
@meder:我需要英文和带重音/外文字符。 - Alix Axel
2个回答

21

试试这个:

(?:[\w\-](?<!_))+

它会对所有被编码为\w(或破折号)的字符进行简单匹配,并使用零宽度回顾后发现刚才匹配的字符不是下划线。

否则,你可以选择这个:

(?:[^_\W]|-)+

这是一种更加基于集合的方法(注意大写字母W)。

好吧,在 PHP 中,我用 PCRE 玩了很多 Unicode 的花样:D Peekaboo 说有一个简单的解决方案可用:

[\p{L}\p{N}\-]+

\p{L} 匹配任何Unicode字符,都可以被视为字母(注意:不包括单词字符,因此不包括下划线),而 \p{N} 匹配任何看起来像数字的字符(包括罗马数字和更多奇特的字符)。
\- 就是一个转义的破折号。虽然不是严格必要的,但我倾向于在字符类中转义破折号...请注意,Unicode 中有几十种不同的破折号,因此会出现以下版本:

[\p{L}\p{N}\p{Pd}]+

“Pd”指的是标点破折号,其中包括但不限于我们的减号破折号。请注意,这里没有下划线。


否定\W是否不包括连字符? - codaddict
@dionadar - 这对我来说不匹配重音字符。 - meder omuraliev
1
据我所知,连字符“-”不包含在\w中 - 即使它被包含在内,这样表述也不会有任何问题 ;) - danielschemmel
@meder OP 表示:“如果我设置了 u 修饰符,\w [...] 也会匹配 UTF-8 字符。” - danielschemmel
1
\p{N} 包括各种数字 - 据我所知,Nd 表示 0-9 的数字,而 Nl 包括罗马字面值(在 Unicode 中,罗马数字 1 不是字母 I,而是看起来像它的东西),No 则几乎包括了其他两个中找不到的所有数字。 - danielschemmel
显示剩余8条评论

3
我不确定您使用的是哪种语言,但在 PERL 中,当正确的语言环境设置后,您可以简单地编写:[[:alnum:]-]+。

很高兴知道这个,但我正在使用PHP(PCRE引擎)。 - Alix Axel
在 PHP 和 Rubular(Ruby)中尝试过,参见 http://www.rubular.com/regexes/12922 和 http://www.rubular.com/regexes/12923。 - Alix Axel
1
在PCRE中,[:alnum:]可以替换为\p{IsAlnum},你可以尝试使用\p{L}\p{N}。 - Jiri Klouda

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