如何在多行正则匹配失败时终止执行并验证整体有效性
多行文本正则验证:遇首个无效行即终止判定
文本示例
* 123 1234 12* 1234-123 1234-12* 1234-1234-123 1234-1234-123* 1234-1234-1234 2342-*2340 985*-895-
现有匹配规则
我已经有能精准匹配有效条目的正则,有效行是第1、4、6、8、9行:
(?m)^\d{0,3}\*$|^\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{4}$
需求
我需要把这个正则改成验证器逻辑:逐行检查,只要碰到第一个无效行就立刻终止,直接判定整个文本无效。
尝试过的方法及问题
我试过写反向匹配的正则来抓无效行:
(?m)^(?!^\d{0,3}\*$|^\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{4}$).*?$
虽然能匹配到无效行,但没法实现“遇首个无效行就终止并判定整体无效”的验证逻辑。我想直接用常规验证器控件搞定,不想写自定义验证代码,但一直没成功。
解决方案
要实现这种“全量有效才通过,遇错即停”的验证,你需要调整正则,让它要求整个文本的每一行都必须符合有效规则,利用正则的匹配特性,一旦某行不符合就停止匹配。
用这个正则试试:
\A(?:^\d{0,3}\*$|^\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{4}$)(?:\R(?:^\d{0,3}\*$|^\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{0,3}\*$|^\d{4}-\d{4}-\d{4}$))*\z
正则解释:
\A:锁定文本开头,避免跨行匹配的歧义(?:有效行规则):非捕获组,匹配单行有效内容(?:\R(有效行规则))*:匹配后续的每一行,\R兼容所有换行格式(Windows的\r\n、Linux的\n),*表示可以有0或多个后续有效行\z:锁定文本结尾,确保没有多余的无效内容
这个正则会从文本开头逐行匹配,只要有一行不符合规则,整个匹配就失败,完全符合你的需求,而且可以直接在常规验证器控件里使用,不用写自定义代码。
内容的提问来源于stack exchange,提问作者IgnusFast
相关产品推荐
相关产品推荐

