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

如果我理解正确的话,有:

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

第一个问题是:像“1Bob”这样的东西不应该失败(因为前瞻)。那么为什么会失败呢?

第二个问题是在哪里可以找到 Ll、Lm、Lo、Lt 和 Lu 中字符的列表或解释?

4

2 回答 2

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

于 2012-09-22T09:29:51.783 回答
1
(?![_\.\'\-])

是相同的

(?![_.'-])

括号字符类中的大多数元字符不需要转义。如果破折号是可理解范围的一部分,则需要转义。由于破折号位于括号字符类的末尾,因此也不需要转义。

于 2012-09-23T05:46:39.960 回答