Php 正则表达式:\w-“_&引用+&引用-&引用;在UTF-8中

Php 正则表达式:\w-“_&引用+&引用-&引用;在UTF-8中,php,regex,unicode,utf-8,pcre,Php,Regex,Unicode,Utf 8,Pcre,我需要一个匹配UTF-8字母和数字的正则表达式,破折号(-),但不匹配下划线()。我尝试了这些愚蠢的尝试,但没有成功: ([\w-^))+ ([\w^-?)+ (\w[^ u]-?)+ \w是[A-Za-z0-9\]的简写,但如果我设置了u修饰符,它也与UTF-8字符匹配 有人能帮我解决这个问题吗?试试这个: (?:[\w\-](?<!_))+ 这是一种更基于集合的方法(注意大写的W) 好的,我对php风格的PCREs:D中的unicode非常感兴趣 Peekaboo说有一个简单的解

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

  • ([\w-^))+
  • ([\w^-?)+
  • (\w[^ u]-?)+
\w
[A-Za-z0-9\]
的简写,但如果我设置了
u
修饰符,它也与UTF-8字符匹配

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

试试这个:

(?:[\w\-](?<!_))+
这是一种更基于集合的方法(注意大写的W)

好的,我对php风格的PCREs:D中的unicode非常感兴趣 Peekaboo说有一个简单的解决方案:

[\p{L}\p{N}\-]+
\p{L}匹配任何符合字母条件的unicode(注意:不是单词字符,因此没有下划线),而\p{N}匹配任何看起来像数字的东西(包括罗马数字和更奇特的东西)。
\-这只是一次侥幸逃脱的冲刺。虽然不是严格必要的,但我倾向于在角色类中避免破折号。。。请注意,unicode中有几十个不同的破折号,因此产生了以下版本:

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

其中“Pd”是标点破折号,包括但不限于减号破折号。(注意,这里也没有下划线)。

我不确定您使用的是哪种语言,但在PERL中,您只需在设置了正确的语言环境后编写:[[:alnum:]-]+。

请具体说明“UTF-8字母”-你能确认你想要的不仅仅是英语字符吗?@meder:我想要英语和重音/外国字符。否定\W不包括hypen吗?@dionadar-这对我来说与重音字符不匹配。@Coddict据我所知,连字符不包括在\W中-即使是,这样说也不会有什么坏处;)@meder OP说:“如果我设置了u修饰符,那么\w[…]也匹配UTF-8字符。”\p{N}包括所有类型的数字-afaik Nd跳0-9舞,而Nl包括罗马文字(在unicode中,罗马1不是字母I,而是看起来像它的东西),而No几乎是他们在其他两个字母中找不到的所有东西,但仍然是一个数字。很高兴知道这一点,但我使用的是PHP(PCRE引擎)。在PHP和Rubular(Ruby)中尝试过,请参见和。[:alnum:]可以替换为\p{IsAlnum}在PCRE中您可以尝试\p{L}\p{N}
[\p{L}\p{N}\p{Pd}]+