PHP正则表达不匹配所需的子串

时间:2013-03-20 10:45:13

标签: php regex

我写了下一个正则表达式

$pattern = "~\d+[.][\s]*[A-Z]{1}[A-Za-z0-9\s-']+~";

为了将子字符串匹配为2.bon jovi - it's my life

问题是唯一被认可的部分是 - bon jovi 没有“ - ”或“'”被这个正则表达式识别。

我更愿意知道我写的正则表达式有什么问题,而不是换一个新表达式。

6 个答案:

答案 0 :(得分:0)

一个更好的正则表达式来处理...

$pattern = "~\d+\.\s*[\pL\pP\s]+~";

CodePad

这将匹配一个数字,后跟一个.,后跟可选的空格,后跟一个或多个Unicode字母,空格或标点符号。

答案 1 :(得分:0)

您的正则表达式指出在句点字符(可以更改为\.)之后,您将有零个或多个空格字符,然后应该跟随1 大写字母。在你的字符串中,你没有任何大写字母。

其次,-应该在您想要匹配时放在最后。因此,将正则表达式更改为:~\d+[.][\s]*[A-Z]{1}[A-Za-z0-9\s'-]+~将匹配如下内容:2.Bon jovi - it's my life

另一方面,您可以将其更改为:~\d+[.][\s]*[A-Za-z0-9\s'-]+~以匹配类似的内容:2.bon jovi - it's my life

编辑:根据Marko D和aleation的评论推荐。

答案 2 :(得分:0)

$pattern = "~\d+\..*~";    
$string = "2.bon jovi - it's my life";
preg_match($pattern, $string, $match);

print_r($match);

输出:数组([0] => 2.bon jovi - 这是我的生活)

答案 3 :(得分:0)

您的regrex如下。

~                 // delimiter
\d+               // 1 or more numbers
[.]               // a period
[\s]*             // 0 or more whitespace characters
[A-Z]{1}          // 1 upper case letter
[A-Za-z0-9\s-\']+ // 1 or more characters, from the character class
~                 //delimiter

将其与字符串“2.bon jovi”进行比较您有:

~                 //
\d+               // "2"
[.]               // "."
[\s]*             // ""
[A-Z]{1}          // <- NO MATCH
[A-Za-z0-9\s-\']+ // 
~                 // 

“bon”不以首字母开头,因此与[A-Z]{1}

不匹配

清洁正则表达式

您可以采取一些简单的方法来清理正则表达式

  • 不要为一个字符使用字符类
  • 不指定{1}它与不存在相同

将上述内容应用于您现有的正则表达式:

$pattern = "~\d+\.\s*[A-Z][A-Za-z0-9\s-']+~";

稍微容易阅读。

答案 4 :(得分:0)

所以我理解这个正则表达式的方式是:

\d+      // Match any digit, 1 or more times  
[.]      // Match a dot  
[\s]*    // Match 0 or more whitespace characters  
[A-Z]{1} // Match characters between an UPPERCASE A-Z Range 1 time  
[A-Za-z0-9\s-']+ // Match characters between A-Z, a-z, 0-9, whitespace, dashe and apostrophe

如此直接,你的'bon jovi'可能无法匹配,因为它是小写的,而你只是在寻找大写字符。 'bon jovi'也包含一个空格,所以可能改变正则表达式的那部分以允许小写字符和空格可能有帮助,所以你最终得到:

$pattern = "~\d+[.][\s]*[A-Za-z\s]{1}[A-Za-z0-9\s-']+~";

注意:我在RegExr(http://gskinner.com/RegExr/)上快速测试了它,它似乎与字符串匹配。

答案 5 :(得分:-1)

您的[A-Z]{1}子模式需要一个大写字母,因此"2.bon jovi - it's my life"将不匹配。

您需要转义-字符类中的[A-Za-z0-9\s-'],或将其放在开头或结尾,否则指定范围。

"~\d+\.[A-Za-z0-9\s'-]+~"

正如评论中所指出的,实际上没有必要在正则表达式中转义字符类中的-。这只是因为你碰巧在它前面加上了一个不能成为范围一部分的元字符\s。通常情况下,如果要匹配文字-并且在字符类中使用它,则必须将其转义或如上所述进行定位。