很抱歉 - 为了清楚起见,我已对此进行了编辑(我之后试图删除粗体,但它不会消失......源文件中的星号是扔掉它):
我正在解析医疗索赔文件,需要查找一个字符串与另一个字符串之间匹配的任何实例,但前提是匹配是在另一个字符串满足之前出现的。
我要搜索的特定字符串是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〜
答案 0 :(得分:1)
我不太确定我是否理解了您的问题,但假设您要捕获DTP*431
和REF*6R
之间的内容,包括DTP*431
,那么您可以使用此正则表达式:< / p>
(DTP\*431.*?)REF\*6R
<强> Working demo 强>
将内容保存到丢弃REF * 6R的捕获组中。您可以在蓝色中看到匹配,在绿色中看到捕获组内容。
答案 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