不规则出现的重复字符串的正则表达式

时间:2011-06-30 19:03:25

标签: regex ultraedit

我搜索过但没有找到问题的答案 - 也许这是显而易见的,没有人不得不问......

我正在使用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段缺失值或包含一个或多个空格

如果找到

CAS\*(OA|PR|CR|CO)\*\*[-]?[\d]+\.?[\d]{0,2}〜匹配第一个实例 CAS\*(OA|PR|CR|CO)\*[\s]+?\*[-]?[\d]+\.?[\d]{0,2}〜匹配第一个实例,如果找到

CAS段不丢失值或包含空格

CAS\*(OA|PR|CR|CO)\*[^0-9A-Z]+?\*[-]?[\d]+\.?[\d]{0,2}~再次匹配第一个实例

使用上述组合的负面前瞻(我是尝试此方法的新手)

^(?:(?!ab).)+$ - ab => one of the above regular expressions - 永远不会让它发挥作用

问题:

如何编写正则表达式来强制/验证EVERY实例的格式,无论它发生的频率如何(可能有0个实例)?

2 个答案:

答案 0 :(得分:1)

要说你的字符串中的每个CAS实例都有效,就是说至少存在一个无效的CAS序列。你使用负面预测的方法是最简单的表示方法 - 这是一个例子:

/^(?!.*CAS(?!<whatever matches a valid CAS instance>))/

基本上:“确保字符串中不存在CAS的实例,该实例未跟随有效CAS实例的任何内容”。替换第二个负向前瞻的内容,并包括“CAS”之前的任何内容,指示CAS实例的开始。

正如您所看到的,您不需要从头到尾匹配字符串以执行您想要的操作。

答案 1 :(得分:0)

这个想法将确保整条线是正确的。例如。除非它是正确的,否则它将不匹配。

^(regexThatOnlyMatchesASingleCorrectInstance)*$

^行的开头开始,匹配+ regexThatOnlyMatchesASingleCorrectInstance的{​​{1}}的数量,并确保找到字符串$的末尾在最后一个之后。

当然,只有在字符串末尾有~时才会有效。对于~部分,请使用:(?:~|$),这样您就不需要字符串末尾的分隔符。