^(?![_\.\'\-])(?:[\p{L} ]+)$
如果我理解正确,有:
(?![_\.\'\-])
负向前瞻,即字符串不能以下划线,点,撇号或减号(任意数量)开头。(?:[\p{L} ]+)
允许Ll,Lm,Lo,Lt和Lu中的至少一个字符和空格。第一个问题是:“1Bob”之类的东西不应该失败(因为前瞻)。那么why it fails?
第二个问题是我可以在Ll,Lm,Lo,Lt和Lu找到字符列表或解释的地方吗?
答案 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