我搜索过但没有找到问题的答案 - 也许这是显而易见的,没有人不得不问......
我正在使用UltraEdit 16.00
来运行我的Regular Expressions in PERL mode
...
我有一个分隔的字符串,可以包含可变数量的重复段,这些段必须遵循非常特定的格式。这些段在整个分隔的字符串中随机出现。
CLP*data*data*data~REF*data*data~N1*data*data*data~**CAS*OA*29*99.99**~AMT*I*99.99~SVC*data*data*data*data~**CAS*PR*99.99**~**CAS*CO**99.99**~DTM*150*date~AMT*B6*99.99~SVC*data*data*data*data~CAS*PR*N16*99.99~**CAS*CO* *99.99**...line continues from here.
格式正确 - CAS*OA*29*99.99~
格式错误1 - CAS*OA* *99.99~
格式错误2 - CAS*OA**99.99~
仅识别所有CAS段遵循该格式的字符串。
(顺便说一句:我知道我的正则表达式没有优化,所以请给我一个休息时间)
CAS\*(OA|PR|CR|CO)\*\*[-]?[\d]+\.?[\d]{0,2}
〜匹配第一个实例
CAS\*(OA|PR|CR|CO)\*[\s]+?\*[-]?[\d]+\.?[\d]{0,2}
〜匹配第一个实例,如果找到
CAS\*(OA|PR|CR|CO)\*[^0-9A-Z]+?\*[-]?[\d]+\.?[\d]{0,2}~
再次匹配第一个实例
^(?:(?!ab).)+$
- ab
=> one of the above regular expressions
- 永远不会让它发挥作用
如何编写正则表达式来强制/验证EVERY实例的格式,无论它发生的频率如何(可能有0个实例)?
答案 0 :(得分:1)
要说你的字符串中的每个CAS实例都有效,就是说至少存在一个无效的CAS序列。你使用负面预测的方法是最简单的表示方法 - 这是一个例子:
/^(?!.*CAS(?!<whatever matches a valid CAS instance>))/
基本上:“确保字符串中不存在CAS的实例,该实例未跟随有效CAS实例的任何内容”。替换第二个负向前瞻的内容,并包括“CAS”之前的任何内容,指示CAS实例的开始。
正如您所看到的,您不需要从头到尾匹配字符串以执行您想要的操作。
答案 1 :(得分:0)
这个想法将确保整条线是正确的。例如。除非它是正确的,否则它将不匹配。
^(regexThatOnlyMatchesASingleCorrectInstance)*$
从^
行的开头开始,匹配+
regexThatOnlyMatchesASingleCorrectInstance
的{{1}}的数量,并确保找到字符串$
的末尾在最后一个之后。
当然,只有在字符串末尾有~
时才会有效。对于~
部分,请使用:(?:~|$)
,这样您就不需要字符串末尾的分隔符。