1

我搜索但没有找到问题的答案 - 也许它是如此明显以至于没有其他人不得不问......

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- 从来没有让它工作

问题:

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

4

2 回答 2

1

说字符串中的每个 CAS 实例都是有效的,就是说不存在至少一个无效的 CAS 序列。您使用负前瞻的方法是表示这一点的最简单方法 - 这是一个示例:

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

基本上:“确保字符串中不存在一个 CAS 实例,其后面没有匹配有效的 CAS 实例”。替换第二个否定前瞻的内容,并在“CAS”之前包含指示 CAS 实例开始的任何内容。

正如你所看到的,你不需要从头到尾匹配字符串来做你想做的事。

于 2011-06-30T19:17:00.720 回答
0

这个想法将确保整行是正确的。EG 除非它是正确的,否则它不会匹配该行。

^(regexThatOnlyMatchesASingleCorrectInstance)*$

这从行首开始^并尽可能多地匹配+regexThatOnlyMatchesASingleCorrectInstance并确保$在最后一个字符串之后找到字符串的结尾。

当然,这仅~在字符串末尾有 a 时才有效。对于该~部分,请使用 this: (?:~|$)以便您不需要在字符串末尾使用分隔符。

于 2011-06-30T19:15:49.057 回答