【问题标题】:RegEx: \w - "_" + "-" in UTF-8正则表达式:\w - UTF-8 中的“_”+“-”
【发布时间】:2011-01-04 22:51:10
【问题描述】:

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

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

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

谁能帮我解决这个问题?

【问题讨论】:

  • 请具体说明“UTF-8 字母” - 你能确认你想要的不仅仅是英文字符吗?
  • @meder:我想要英文重音/外来字符。

标签: php regex unicode utf-8 pcre


【解决方案1】:

试试这个:

(?:[\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 不包括连字符?
  • @dionadar - 这与我的重音字符不匹配。
  • @codadict 据我所知,连字符不包含在 \w 中——即使是这样,这样说也无妨;)
  • @meder OP 声明:“如果我设置了 u 修饰符,\w [...] 也匹配 UTF-8 字符。”
  • \p{N} 包括各种数字 - afaik Nd 跳 0-9 舞,而 Nl 包括罗马文字(在 unicode 中,罗马 1 不是字母 I,而是看起来喜欢它)和 No 几乎是他们在其他两个中找不到的所有东西,但仍然是一个数字。
【解决方案2】:

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

【讨论】:

  • 很高兴知道,但我使用的是 PHP(PCRE 引擎)。
  • 在 PHP 和 Rubular (Ruby) 中尝试过,请参阅 rubular.com/regexes/12922rubular.com/regexes/12923
  • [:alnum:] 可以在 PCRE 中替换为 \p{IsAlnum} 你可以尝试 \p{L}\p{N}
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2011-09-18
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多