正则表达式使用Notepad ++在第一个字符串和另一个字符串的第一个实例之间找到字符串

时间:2015-03-11 16:37:11

标签: regex string search notepad++

很抱歉 - 为了清楚起见,我已对此进行了编辑(我之后试图删除粗体,但它不会消失......源文件中的星号是扔掉它):

我正在解析医疗索赔文件,需要查找一个字符串与另一个字符串之间匹配的任何实例,但前提是匹配是在另一个字符串满足之前出现的。

我要搜索的特定字符串是DTP * 431和REF * 6R(I' m包括DTP * 431作为其中的一部分,因为在某些情况下它将被删除)。

如果DTP * 431 * D8 *之后的8位数字紧跟在文件中下一个DTP * 472 * RD8 *实例之后的8位数字,并且不继续搜索,我需要正则表达式返回匹配在紧接DTP * 472 * RD8 *

的下一个实例之后的8位数之后

此示例不应返回匹配项,因为DTP * 431 * D8 *(20150101)之后的8位数字与DTP * 472 * RD8 *(20150102)的下一个实例之后的8位数字不匹配:

DTP * 431 * * D8〜20150101
[中间的可变文本]
LX * 1〜
DTP * 472 * RD8 * 20150102-20150102〜
REF * 6R * [更多信息]〜
[中间的可变文本]
DTP * 431 * D8 * 20141231〜
[中间的可变文本]
LX * 1〜
DTP * 472 * RD8 * 20150103-20150103〜
REF * 6R * [更多信息]〜

此示例应返回匹配项,但应仅反映匹配项,因为紧随DTP * 431 * D8 *(20150101)之后的8位数字与文件中出现的第一个DTP * 472 * RD8 *实例后的8位数字完全匹配(20150101):


DTP * 431 * D8 * 20150101〜
[中间的可变文本]
LX * 1〜
DTP * 472 * RD8 * 20150101-20150101〜
REF * 6R * [更多信息]〜
[中间的可变文本]
DTP * 431 * D8 * 20141231〜
[中间的可变文本]
LX * 1〜
DTP * 472 * RD8 * 20150102-20150102〜
REF * 6R * [更多信息]〜

此示例不应返回匹配项,因为即使在DTP * 431 * D8 *的实例和DTP * 472 * RD8 *(20150101)的实例之后的前8位数之间存在匹配,它也不是下一个实例DTP * 472 * RD8 *提供匹配:

DTP * 431 * D8 * 20150101〜
[中间的可变文本]
LX * 1〜
DTP * 472 * RD8 * 20150103-20150103〜
REF * 6R * [更多信息]〜
[中间的可变文本]
DTP * 431 * D8 * 20141231〜
[中间的可变文本]
LX * 1〜
DTP * 472 * RD8 * 20150101-20150101〜
REF * 6R * [更多信息]〜

这就是我到目前为止所得到的:

(DTP * 431 * * D8);(?*)(小于?= \ DTP * 431 * D8 *)([0-9] {8})(?= \ DTP * 472)(DTP * 472 * RD8 *)(\ 2)

...但是如果DTP * 472的第一个实例中的日期不匹配,则它将继续超过第一个DTP * 472,直到找到任何日期与\ 1元素匹配的DTP * 472。

因此,如果我搜索以下文本,它将(不合需要地)匹配粗体部分:

DTP * 431 * * D8〜20150101
[中间的可变文字]
LX * 1〜
DTP * 472 * * RD8〜20150102-20150102
REF * 6R * [更多信息]〜
[中间的可变文字]
DTP * 431 * * D8〜20141231
[中间的可变文字]
LX * 1〜
DTP * 472 * * RD8 20150101 -20150101〜
REF * 6R * [更多信息]〜


我想要做的就是删除DTP * 431 * D8 *的整行,如果DTP * 431 * D8 *之后的8位数字紧跟DTP * 472的下一个实例之后的8位数字* RD8 *

这是我从网上下载并修改的示例(我无法使用实际数据)。这个项目应该产生一个匹配:

ISA * 00 * * 01 * SECRET ZZ SUBMITTERS.ID ZZ RECEIVERS.ID * 150101 * 0001 * ^ * 00501 * 00000001 * 1 * T *:〜
GS HC SENDER CODE * RECEIVER CODE * 0 * 0001 * 1 * X * 005010X222~
ST * 837 * 0021 * 005010X222〜
BHT * 0019 * 00 * 244579 * 20150101 * 1023 * CH〜
NM1 * 41 * 2 *计费服务***** 46 * 9999999~
PER IC DOE * JOHN * 3055552222 * EX * 111〜
NM1 * 40 * 2 * ABC保险公司***** 46 * 1111111~
HL * 1 * * 20 * 1~
PRV BI PXC * 1234597890〜
NM1 * 85 * 2 *医生办公室***** XX * 9876543210~
N3 * 1234 MAIN ST~
N4 * LOS ANGELES * CA * 11111~
REF * EI * 222222222〜
NM1 * 87 * 2〜
N3 * 2345 MAIN ST~
N4 * LOS ANGELES * CA * 11111~
HL * 2 * 1 * 22 * 1〜
SBR * P ******** CI〜
NM1 * IL * 1 * DOE * JANE **** MI * 11332255〜
DMG *​​ D8 * 10000101 * O〜
NM1 * PR * 2 * DEF保险公司***** PI * 999996666~
HL * 3 * 2 * 23 * 0〜
PAT * 19〜
NM1 * QC * 1 * JONES * JOHN〜
N3 * 111 N MAIN ST~
N4 * LOS ANGELES * CA * 22222~
DMG *​​ D8 * 10000202 * O〜
CLM * 888888 * 1 *** 11:B:1 * Y A 的Y * I〜
DTP * 431 * D8 * 20150201〜
REF * D9 * 1〜
HI * BK:9999 * BF:V999〜
LX * 1〜
SV1 * HC:99999 * 1 * UN * 1 *** 1〜
DTP * 472 * RD8 * 20150101-20150201〜
REF * 6R * 000001〜
SE * 33 * 0021〜
GE * 1 * 1〜
国际能源署(IEA)* 1 * 000000001〜

使用此功能,如果找到匹配项,我将完全删除DTP * 431 * D8行,然后文件显示如下:

ISA * 00 * * 01 * SECRET ZZ SUBMITTERS.ID ZZ RECEIVERS.ID * 150101 * 0001 * ^ * 00501 * 00000001 * 1 * T *:〜
GS HC SENDER CODE * RECEIVER CODE * 0 * 0001 * 1 * X * 005010X222~
ST * 837 * 0021 * 005010X222〜
BHT * 0019 * 00 * 244579 * 20150101 * 1023 * CH〜
NM1 * 41 * 2 *计费服务***** 46 * 9999999~
PER IC DOE * JOHN * 3055552222 * EX * 111〜
NM1 * 40 * 2 * ABC保险公司***** 46 * 1111111~
HL * 1的 20 * 1〜
PRV BI PXC * 1234597890〜
NM1 * 85 * 2 *医生办公室***** XX * 9876543210~
N3 * 1234 MAIN ST~
N4 * LOS ANGELES * CA * 11111~
REF * EI * 222222222〜
NM1 * 87 * 2〜
N3 * 2345 MAIN ST~
N4 * LOS ANGELES * CA * 11111~
HL * 2 * 1 * 22 * 1〜
SBR * P ******** CI〜
NM1 * IL * 1 * DOE * JANE **** MI * 11332255〜
DMG *​​ D8 * 10000101 * O〜
NM1 * PR * 2 * DEF保险公司***** PI * 999996666~
HL * 3 * 2 * 23 * 0〜
PAT * 19〜
NM1 * QC * 1 * JONES * JOHN〜
N3 * 111 N MAIN ST~
N4 * LOS ANGELES * CA * 22222~
DMG *​​ D8 * 10000202 * O〜
CLM * 888888 * 1 *** 11:B:1 * Y A 的ý I〜
REF
D9 * 1〜
HI * BK:9999 * BF:V999〜
LX * 1〜
SV1 * HC:99999 * 1 * UN * 1 *** 1〜
DTP * 472 * RD8 * 20150101-20150201〜
REF * 6R * 000001〜
SE * 33 * 0021〜
GE * 1 * 1〜
国际能源署(IEA)* 1 * 000000001〜


相反,此项目不会匹配,文件将保留原样:

ISA * 00 * * 01 * SECRET ZZ SUBMITTERS.ID ZZ RECEIVERS.ID * 150101 * 0001 * ^ * 00501 * 00000001 * 1 * T *:〜
GS HC SENDER CODE * RECEIVER CODE * 0 * 0001 * 1 * X * 005010X222~
ST * 837 * 0021 * 005010X222〜
BHT * 0019 * 00 * 244579 * 20150101 * 1023 * CH〜
NM1 * 41 * 2 *计费服务***** 46 * 9999999~
PER IC DOE * JOHN * 3055552222 * EX * 111〜
NM1 * 40 * 2 * ABC保险公司***** 46 * 1111111~
HL * 1
20 * 1〜
PRV BI PXC * 1234597890〜
NM1 * 85 * 2 *医生办公室***** XX * 9876543210~
N3 * 1234 MAIN ST~
N4 * LOS ANGELES * CA * 11111~
REF * EI * 222222222〜
NM1 * 87 * 2〜
N3 * 2345 MAIN ST~
N4 * LOS ANGELES * CA * 11111~
HL * 2 * 1 * 22 * 1〜
SBR * P ******** CI〜
NM1 * IL * 1 * DOE * JANE **** MI * 11332255〜
DMG *​​ D8 * 10000101 * O〜
NM1 * PR * 2 * DEF保险公司***** PI * 999996666~
HL * 3 * 2 * 23 * 0〜
PAT * 19〜
NM1 * QC * 1 * JONES * JOHN〜
N3 * 111 N MAIN ST~
N4 * LOS ANGELES * CA * 22222~
DMG *​​ D8 * 10000202 * O〜
CLM * 888888 * 1 *** 11:B:1 * Y A 的Y * I〜
DTP * 431 * D8 * 20150201〜
REF * D9 * 1〜
HI * BK:9999 * BF:V999〜
LX * 1〜
SV1 * HC:99999 * 1 * UN * 1 *** 1〜
DTP * 472 * RD8 * 20150102-20150202〜
REF * 6R * 000001〜
SE * 33 * 0021〜
GE * 1 * 1〜
IEA * 1 * 000000001〜

2 个答案:

答案 0 :(得分:1)

我不太确定我是否理解了您的问题,但假设您要捕获DTP*431REF*6R之间的内容,包括DTP*431,那么您可以使用此正则表达式:< / p>

(DTP\*431.*?)REF\*6R

<强> Working demo

将内容保存到丢弃REF * 6R的捕获组中。您可以在蓝色中看到匹配,在绿色中看到捕获组内容。

enter image description here

答案 1 :(得分:1)

好的,重做。现在看你的样品。
它变得非常复杂。有很多事情在发生。

试图解释它会很乏味。所以,我把所有的解释都放在了 正则表达式评论。

只需用“”替换匹配,你应该好好去。

RegexFormat 5格式化,调试,测试和分析。

 # (?sm)(?:^[ \t]*DTP\*\d{3}\*R?D\d\*(\d{8})[^\r\n]*\r?\n(?=(?:(?!^[ \t]*DTP\*\d{3}\*R?D\d\*).)*^[ \t]*DTP\*\d{3}\*R?D\d\*(?:\1|\d{8}-\1).*?^[ \t]*REF\*6R)|^[ \t]*DTP\*\d{3}\*R?D\d\*\d{8}-(\d{8})[^\r\n]*\r?\n(?=(?:(?!^[ \t]*DTP\*\d{3}\*R?D\d\*).)*^[ \t]*DTP\*\d{3}\*R?D\d\*(?:\2|\d{8}-\2).*?^[ \t]*REF\*6R))

 (?sm)
 (?:
      ^ [ \t]* DTP\* \d{3} \*R?D \d \*
      ( \d{8} )                           # (1), Checking "first" NUMBER spot
      [^\r\n]* \r? \n                     # Grab the rest of this line

      (?=                                 # Lookahead 
           (?:                                 # Not a DTP line
                (?! ^ [ \t]* DTP\* \d{3} \*R?D \d \* )
                . 
           )*
           ^ [ \t]* DTP\* \d{3} \*R?D \d \*    # The very next 'DTP' line
           (?: \1 | \d{8} - \1 )               # Number must be in one of these spots
           .*? ^ [ \t]* REF\*6R                # The ending
      )

   |                                    ## Or, 

      ^ [ \t]* DTP\* \d{3} \*R?D \d \*
      \d{8} - 
      ( \d{8} )                           # (2), Checking "second" NUMBER spot
      [^\r\n]* \r? \n                     # Grab the rest of this line

      (?=                                 # Lookahead
           (?:                                 # Not a DTP line
                (?! ^ [ \t]* DTP\* \d{3} \*R?D \d \* )
                . 
           )*
           ^ [ \t]* DTP\* \d{3} \*R?D \d \*    # The very next 'DTP' line
           (?: \2 | \d{8} - \2 )               # Number must be in one of these spots
           .*? ^ [ \t]* REF\*6R                # The ending
      )
 )

您可能希望将 Lookaheads 转换为捕获组((?=..)(..),然后调整backrefs以指向\1和{{1} }。
此时,替换只是\3\2\4 这样做是将搜索位置移动到结尾,避免可能的重叠。

$2$4