在正则表达式中导致意外行为的换行符

时间:2014-07-09 22:43:24

标签: c# regex

我在使用正如我期望的方式运行正则表达式时遇到了一些麻烦。根据我在regexhero中的测试,它似乎与我试图匹配/捕获换行符的方式有关。我试图匹配并替换X12文件中的文本;这是一个样本:

CLP*600256417*1*50.00*28.52**WC*30567856570-0001~
NM1*QC*1*JOHN*DOE*D***MI*79999990P~
CLP*609723417*1*50.00*28.52**WC*33345470247-0001~
CAS*CO*45*21.48~
NM1*QC*1*JOHN*DOE*D***MI*738787490P~

我需要做的是匹配以" CLP *"开头的所有行。没有后跟一行以" CAS *"开头的行。在这个过程中,我需要在匹配的" CLP"中捕获两个金额。行,并希望捕获下一行之前存在的换行符/回车符的任何组合。

这是我期待的正则表达式可以实现这一点:

CLP(\*[^\*]*){2}\*(?<ClaimAmount>\d*\.\d{2})\*(?<ClaimPaymentAmount>\d*\.\d{2}).*?~(?<newlineFormat>[\n|\r|\f]*)?(?!CAS\*)

我看到的结果是&#34; CLP&#34;线条正在匹配 - 我期待第二个被正则表达式末尾的负向前瞻排除。如果我从我的&#34; newlineFormat&#34;中移除*捕获组以及跟随它的?,它按预期工作 - 只有第一个&#34; CLP&#34;线匹配。我不认为这对我有用,因为它需要某种形式的换行符,但我使用的文件格式不一定要有任何换行符。< / p>

1 个答案:

答案 0 :(得分:2)

您可以将否定前瞻更改为以下内容:

(?!\s*CAS\*)

Live Demo

此外,您没有在角色类中使用分隔符,而是匹配文字|,将其更改为:

[\n\r\f]