尝试调整 PCRE 正则表达式以在 .NET (C#) 中使用

问题描述 投票:0回答:2

我正在开发一个 C# 应用程序,用于从 .x12 (txt) 文件中提取可重复的模式。我已经能够构建 PCRE 正则表达式来完成任务,但无法将其适应 C# 的正则表达式。

下面是我试图隔离的文本:

HL*1**20*1~  
PER*IC*XX HEALTH XXXX XXXXX*TE*6822363000*FX*6822364615~  
NM1*87*2~  
N3*2448 XXXXX DR~  
N4*XXXX XXXX*XX*761089998~  
DMG*D8*19530804*F~  
NM1*PR*2*XXXXXX MEDICAL MANAGEMENT*****PI*95958~  
CLM*1111111111*3291.69***13:A:1**A*Y*Y~  
DTP*434*RD8*20160714-20160714~  
CL1*3*2*01~  
HCP*03*480.01~  
NM1*71*1*XXXXXXX*XXXXXXXX****XX*1111111111~  
SBR*P*18*UDF******CI~  
NM1*IL*1*XXXX*XXXXXXX*A***MI*509180801~  
LX*1~  
SV2*0250**44.19*UN*1~  
DTP*472*D8*20160714~  
SVD*95958*0.00**0250*1~  
DTP*573*D8*20160726~  
LX*2~  
SV2*0311*HC:88172*936.25*UN*1~  
DTP*472*D8*20160714~  
SVD*95958*0.00*HC:88172*0311*1~  
CAS*CO*97*936.25~  
DTP*573*D8*20160726~  
LX*3~  
SV2*0311*HC:88173*477.25*UN*1~  
DTP*472*D8*20160714~  
SVD*95958*0.00*HC:88173*0311*1~  
CAS*CO*97*477.25~  
DTP*573*D8*20160726~  
LX*4~  
SV2*0312*HC:88305*456.5*UN*1~  
DTP*472*D8*20160714~  
SVD*95958*0.00*HC:88305*0312*1~  
CAS*CO*97*456.5~  
DTP*573*D8*20160726~  
LX*5~  
SV2*0360*HC:10022*483.75*UN*1~  
DTP*472*D8*20160714~  
SVD*95958*225.41*HC:10022*0360*1~  
CAS*PR*3*250~  
DTP*573*D8*20160726~  
LX*6~  
SV2*0402*HC:76942*893.75*UN*1~  
DTP*472*D8*20160714~  
SVD*95958*0.00*HC:76942*0402*1~  
CAS*CO*97*893.75~  
DTP*573*D8*20160726~  
HL*3**20*1~ <-- FIND UP TO THIS LINE, BUT EXCLUDE FROM RESULTS

我知道这是一段很长的文字。因此,每个正则表达式匹配都包含两行以 HL 开头的行,并转到以 DTP 开头的行,该行位于花药 HL 之前,但不包括下一个 HL。

然后我在notepad++中使用的PCRE正则表达式如下。我已经输入了我的理解和目标后记:

^HL(.+?)DTP(.+?)~(?=([ ]*HL))

  1. 从行首开始查找 HL
  2. 匹配任何内容(包括换行符和回车符),直到出现 DTP 后跟波浪号。
  3. 在 DTP 处停止,其后包含以波形符结尾的任何内容;只要...该 DTP 行出现在以 HL 开头的后续行之前。此外,从比赛中排除下一个 HL。

我不确定这看起来有多令人畏惧,但如果能朝正确的方向推动,我们将不胜感激。

c# .net regex pcre
2个回答
1
投票

如果我理解你的意思,你想捕获所有 DTP 行 为了便于阅读,以下由 # 记录的正则表达式是 dotnet :

PO 正则表达式:^HL(.+?)DTP(.+?)~(?=([ ]*HL))

 ^HL                # strat with HL 
 .+?                 # any character ,one or more, as few as possible
 (
 (?<dtp>DTP.+?~)   # named group start with DTP
                              # any character ,one or more, as few as  possible
                             # ~
(.+?)
(?=DTP)    # match DTP but exclude it from capture
)+

我测试过: http://regexstorm.net/tester

捕获的群体是:

    DTP*434*RD8*20160714-20160714~
    DTP*472*D8*20160714~
    DTP*573*D8*20160726~
    DTP*472*D8*20160714~
    DTP*573*D8*20160726~
    DTP*472*D8*20160714~
    DTP*573*D8*20160726~
    DTP*472*D8*20160714~
    DTP*573*D8*20160726~
    DTP*472*D8*20160714~
    DTP*573*D8*20160726~
    DTP*472*D8*20160714~

尝试一下:http://regexstorm.net/tester

选项:忽略空格/单行/多行


0
投票

感谢大家的回复。 我能够使用以下正则表达式实现我尝试的目标,并希望跟进以可能在将来帮助某人。

^HL[\w\s*~.:-,@() ]?DTP[\w*]~

再次感谢

© www.soinside.com 2019 - 2024. All rights reserved.