14

我需要一个匹配 UTF-8 字母和数字的正则表达式,破折号 ( -) 但不匹配下划线 ( _),我尝试了这些愚蠢的尝试但没有成功:

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

是的\w简写[A-Za-z0-9_],但如果我u设置了修饰符,它也匹配 UTF-8 字符。

谁能帮我解决这个问题?

4

2 回答 2

20

试试这个:

(?:[\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”是标点破折号,包括但不限于我们的减号破折号。(注意,这里再次没有下划线)。

于 2010-01-14T04:50:14.750 回答
3

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

于 2010-01-14T05:33:30.743 回答