^(?![_\.\'\-])(?:[\p{L} ]+)$
如果我理解正确的话,有:
(?![_\.\'\-])
负前瞻,即字符串不能以下划线、点、撇号或减号(任意数量)开头。(?:[\p{L} ]+)
允许在 Ll、Lm、Lo、Lt 和 Lu 中至少有一个字符以及空格。
第一个问题是:像“1Bob”这样的东西不应该失败(因为前瞻)。那么为什么会失败呢?
第二个问题是在哪里可以找到 Ll、Lm、Lo、Lt 和 Lu 中字符的列表或解释?
数字"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
(?![_\.\'\-])
是相同的
(?![_.'-])
括号字符类中的大多数元字符不需要转义。如果破折号是可理解范围的一部分,则需要转义。由于破折号位于括号字符类的末尾,因此也不需要转义。