如何调整正则使preg_match可验证全部行符合管道分隔格式要求
正则调整方案
原正则存在的问题
- 未锚定行和全文的首尾:仅匹配行内符合规则的片段,且只要存在任意一行匹配就返回真,无法校验全量行
- 中间段规则不符合要求:
.*?可匹配空白字符,违反中间段无空白的规则 - 末尾数字匹配不完整:仅匹配单个数字,无法覆盖多位数字的场景
正确正则模式
调整后的正则为:/\A(?:\d+\|\S+\|\d+(?:\R|\z))+\z/
各部分规则说明:
\A:锚定整个文本的绝对开头,避免从文本中间位置开始匹配(?: ... ):非捕获组,用于包裹单行格式规则,不额外占用捕获资源\d+:匹配1位及以上数字,对应首尾两个数字段要求\|:匹配字面量竖线,因竖线是正则特殊字符需转义\S+:匹配1位及以上非空白字符,完全符合中间段无空白的要求(?:\R|\z):匹配行尾的任意换行符(兼容Windows\r\n、Linux\n、Mac\r格式)或文本末尾,避免最后一行无换行时匹配失败+:要求文本至少有一行符合规则,若允许空文本可替换为*\z:锚定整个文本的绝对结尾,保证文本末尾无多余的不符合规则的内容
代码使用示例
// 测试输入 $validInput = "150|example.com/|2500 600|hello_world|1500"; $invalidInput = "150|example.com/|2500 600|hello world|1500"; // 中间段含空格,不符合要求 $pattern = '/\A(?:\d+\|\S+\|\d+(?:\R|\z))+\z/'; // 校验有效输入返回true var_dump(preg_match($pattern, $validInput) === 1); // 输出bool(true) // 校验无效输入返回false var_dump(preg_match($pattern, $invalidInput) === 1); // 输出bool(false)
内容的提问来源于stack exchange,提问作者Iskren
相关产品推荐
相关产品推荐

