You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整正则使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:36:06