我认为这个正则表达式不应该失败,我错过了什么?

时间:2012-09-22 09:16:25

标签: php regex unicode pcre

^(?![_\.\'\-])(?:[\p{L} ]+)$

如果我理解正确,有:

  • (?![_\.\'\-])负向前瞻,即字符串不能以下划线,点,撇号或减号(任意数量)开头。
  • (?:[\p{L} ]+)允许Ll,Lm,Lo,Lt和Lu中的至少一个字符和空格。

第一个问题是:“1Bob”之类的东西不应该失败(因为前瞻)。那么why it fails

第二个问题是我可以在Ll,Lm,Lo,Lt和Lu找到字符列表或解释的地方吗?

1 个答案:

答案 0 :(得分:3)

数字"1"\p{L}不匹配(这只匹配字母!)。如果您想匹配任何(数字)数字,请同时使用课程\p{N}

$text = "1Bob";

if (preg_match("/^(?![_\.\'\-])(?:[\p{N}\p{L} ]+)$/u", $text)) {
  echo "Matched!\n";
} else {
  echo "No match...\n";
}

将打印:

Matched!

此外,Ruby的正则表达式引擎与PHP之间存在细微差别。由于您的目标语言似乎是PHP,我建议使用PHP进行测试,而不是使用Rubular(Ruby)。

请注意,在内部字符类中,“普通”正则表达式字符不具有任何特殊权力,无需转义:preg_match("/^(?![_.'-])(?:[\p{N}\p{L} ]+)$/u", $text)

可以在此处找到许多Unicode字符属性/类的概述:http://www.regular-expressions.info/unicode.html