Php 我认为这个正则表达式不应该失败,我';我失踪了? ^(?![\.\'\-])(?:[\p{L}]+)$

Php 我认为这个正则表达式不应该失败,我';我失踪了? ^(?![\.\'\-])(?:[\p{L}]+)$,php,regex,unicode,pcre,Php,Regex,Unicode,Pcre,如果我理解正确,有: (?![\u\.\'\-])一个负向前看,即字符串不能以下划线、点、撇号或减号(任意数字)开头 (?:[\p{L}]+)允许在Ll、Lm、Lo、Lt和Lu以及空格中至少有一个字符 第一个问题是:像“1Bob”这样的东西不应该失败(因为前瞻性)。那么 第二个问题是在哪里可以找到Ll、Lm、Lo、Lt和Lu中字符的列表或解释?数字“1”与\p{L}不匹配(这只匹配字母!)。如果要匹配任何(数字)数字,请同时使用类\p{N}: $text = "1Bob"; if (pre

如果我理解正确,有:

  • (?![\u\.\'\-])
    一个负向前看,即字符串不能以下划线、点、撇号或减号(任意数字)开头
  • (?:[\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(“/^(?)[[u'.-])(?:[\ p{N}\p{L}]+)$/u“,$text)

这里可以找到许多Unicode字符属性/类的概述:

数字
“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(“/^(?)[[u'.-])(?:[\ p{N}\p{L}]+)$/u“,$text)

以下是许多Unicode字符属性/类的概述:

(?![_.'-])
括号内字符类中的大多数元字符不需要转义。如果破折号是可理解范围的一部分,则需要进行转义。由于破折号位于括号中字符类的末尾,因此也不需要转义

(?![_.'-])


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

因此,“1Bob”失败是因为第二组失败,而不是因为前瞻?@Gremo,正确,只需执行以下操作即可验证:
if(preg\u match(“/^(?![\.\'-])/”,$text)){…
,您可以在前瞻字符类中删除所有这些反斜杠。您可能还需要使用
/u
修饰符,这样Unicode属性才能正常工作。@BartKiers:它是否也适用于非ASCII字母?抱歉输入错误…
s/prüperties/properties
:)@TimPietzcker,呵呵,我搞砸了一些regex问答:我以为这个里面有一个非ascii码…)因此,“1Bob”失败是因为第二组,而不是因为前瞻?@Gremo,正确,通过简单的操作来验证:
如果(preg\u match(“/^(?![\'\'\-])/”,$text)){…}
也可以在前瞻字符类中删除所有这些反斜杠。您可能还需要使用
/u
修饰符,这样Unicode属性才能正常工作。@BartKiers:它是否也适用于非ASCII字母?抱歉输入错误…
s/prüperties/properties
:)@TimPietzcker,呵呵,我搞砸了一些regex问答:我以为这个里面有一个非ascii码…)虽然这是真的,但它并不是对OP问题的回答:这样的评论更适合作为问题下方的评论,而不是作为答案发布。巴特·基尔斯——谢谢你,我是新来的。注释的格式是否不好(不允许换行)?@prolist很高兴知道。有要转义的字符的快速引用吗?Gremo-perldoc-perlrecharclass有一节“括号中的字符类”。您也可以在这里看到相同的信息。@prolist,true,注释不适合长文本块。但如此看来,“答案”必须(或应该)是对问题的真实答案。这不像是一个经典的论坛,在那里评论被添加到帖子中,这里必须(或者应该)是问题和答案。你不必删除你的这个评论/答案,只是为了让你知道它应该如何工作。欢迎!:)虽然这是真的,但它并不是对OP问题的回答:这样的评论更适合作为问题下方的评论,而不是作为答案发布。巴特·基尔斯——谢谢你,我是新来的。注释的格式是否不好(不允许换行)?@prolist很高兴知道。有要转义的字符的快速引用吗?Gremo-perldoc-perlrecharclass有一节“括号中的字符类”。您也可以在这里看到相同的信息。@prolist,true,注释不适合长文本块。但如此看来,“答案”必须(或应该)是对问题的真实答案。这不像是一个经典的论坛,在那里评论被添加到帖子中,这里必须(或者应该)是问题和答案。你不必删除你的这个评论/答案,只是为了让你知道它应该如何工作。欢迎!:)