preg_match正则匹配异常咨询:为何匹配到含数字的字符串
问题分析与解决方案
咱们一步步拆解问题出在哪,我一眼就看出你误解了正则表达式里某个关键部分的作用~
先看你的正则实际在做什么
你写的正则是:preg_match('/(?<=\s)[^,]+(?=\s)/',$data,$matches);
逐个部分拆解:
(?<=\s):正向零宽断言,确保匹配内容的前一个字符是空白(空格)。[^,]+:这是核心问题!你可能误以为这个表示“非数字”,但实际上[^...]是排除字符集——这里面只写了逗号,所以它的意思是「匹配任意不是逗号的字符,至少一次」。数字、字母、空格全包含在内,完全不会排除数字。(?=\s):正向零宽断言,确保匹配内容的后一个字符是空白(空格)。
为什么会匹配到"List Processes 8989"
看你的目标字符串 "20180513 List Processes 8989":
如果字符串末尾带有空格(或者你实际测试的字符串是这样),那么从第一个空格后(List 前面的位置)开始,[^,]+会贪婪地匹配所有非逗号字符,一直到最后一个空格之前——也就是包含了List Processes 8989,因为这些字符都不是逗号,而且后面刚好是空格,完全符合你的正则条件。
修正方案:排除数字字符
如果你想匹配的内容里不能包含数字,只需要把排除字符集里加上数字即可:
如果你想匹配不含数字、逗号、空格的单个单词(比如
List或Processes),可以用:preg_match('/(?<=\s)[^,\d\s]+(?=\s)/',$data,$matches);用
preg_match_all的话会匹配到所有符合的单词,preg_match只会返回第一个匹配项List。如果你想匹配允许空格但不含数字、逗号的整段内容(比如
List Processes),可以用:preg_match('/(?<=\s)[^,\d]+(?=\s)/',$data,$matches);这样会匹配到两个单词组成的短语,因为里面没有数字,符合要求。
内容的提问来源于stack exchange,提问作者Artūras Kalandarišvili
相关产品推荐
相关产品推荐

