Regex 正则表达式使用记事本查找第一个字符串和另一个字符串的第一个实例之间的字符串++;
抱歉-为了清晰起见,我对其进行了编辑(稍后我尝试删除粗体,但它不会消失…源文件中的星号会将其删除): 我正在解析医疗索赔文件,需要找到一个字符串和另一个字符串之间匹配的任何实例,但前提是匹配出现在另一个字符串满足之前 我要搜索的特定字符串是DTP*431和REF*6R(我将DTP*431作为其中的一部分,因为它在某些情况下会被消除) 如果紧跟在DTP*431*D8*后面的8位数字与文件中紧跟在下一个DTP*472*RD8*实例后面的8位数字完全匹配,我需要正则表达式返回匹配,并且不在紧跟在下一个DTP*472*RD8*实例后面的8位数字后继续搜索* 此示例不应返回匹配,因为紧跟在DTP*431*D8*(20150101)之后的8位数字与紧跟在DTP*472*RD8*(20150102)下一个实例之后的8位数字不匹配:Regex 正则表达式使用记事本查找第一个字符串和另一个字符串的第一个实例之间的字符串++;,regex,string,search,notepad++,Regex,String,Search,Notepad++,抱歉-为了清晰起见,我对其进行了编辑(稍后我尝试删除粗体,但它不会消失…源文件中的星号会将其删除): 我正在解析医疗索赔文件,需要找到一个字符串和另一个字符串之间匹配的任何实例,但前提是匹配出现在另一个字符串满足之前 我要搜索的特定字符串是DTP*431和REF*6R(我将DTP*431作为其中的一部分,因为它在某些情况下会被消除) 如果紧跟在DTP*431*D8*后面的8位数字与文件中紧跟在下一个DTP*472*RD8*实例后面的8位数字完全匹配,我需要正则表达式返回匹配,并且不在紧跟在下一个
DTP*431*D8*20150101~
[中间的可变文本]
LX*1~
DTP*472*RD8*20150102-20150102~
参考*6R*[更多信息]~
[中间的可变文本]
DTP*431*D8*20141231~
[中间的可变文本]
LX*1~
DTP*472*RD8*20150103-20150103~
参考*6R*[更多信息]~
此示例应返回匹配,但应仅反映匹配,因为紧跟在DTP*431*D8*(20150101)后面的8位数字与文件(20150101)中出现的DTP*472*RD8*第一个实例后面的8位数字完全匹配:
DTP*431*D8*20150101~
[中间的可变文本]
LX*1~
DTP*472*RD8*20150101-20150101~
参考*6R*[更多信息]~
[中间的可变文本]
DTP*431*D8*20141231~
[中间的可变文本]
LX*1~
DTP*472*RD8*20150102-20150102~
参考*6R*[更多信息]~
此示例不应返回匹配,因为即使DTP*431*D8*实例和DTP*472*RD8*(20150101)实例之后的前8位数字之间存在匹配,也不是DTP*472*RD8*的下一个实例提供该匹配:
DTP*431*D8*20150101~
[中间的可变文本]
LX*1~
DTP*472*RD8*20150103-20150103~
参考*6R*[更多信息]~
[中间的可变文本]
DTP*431*D8*20141231~
[中间的可变文本]
LX*1~
DTP*472*RD8*20150101-20150101~
参考*6R*[更多信息]~
以下是我目前掌握的情况:
(DTP*431*D8*)(?我不太确定我是否理解了你的问题,但是假设你想捕获
DTP*431
和REF*6R
之间的内容,包括DTP*431
,那么你可以使用这个正则表达式:
(DTP\*431.*?)REF\*6R
您将内容保存到捕获组中,丢弃REF*6R。您可以看到蓝色的匹配项和绿色的捕获组内容
好的,重做。现在看看你的样品。
事情变得很复杂,有很多事情在进行 试图解释它会很乏味。因此,我把所有的解释都放在了
正则表达式注释 只要把火柴换成“”就可以了 格式化、调试、测试和分析 您可能希望将Lookaheads转换为捕获组(
(?=…)
到(…)
,然后调整反向参考以指向\1
和\3
此时,替换仅为
\2\4
或$2$4
这样做的目的是将搜索位置移过结束位置,避免可能的重叠
# (?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\*(?:\3|\d{8}-\3).*?^[ \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
( # (2 start), Part to be written back
(?: # 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
) # (2 end)
| ## Or,
^ [ \t]* DTP\* \d{3} \*R?D \d \*
\d{8} -
( \d{8} ) # (3), Checking "second" NUMBER spot
[^\r\n]* \r? \n # Grab the rest of this line
( # (4 start), Part to be written back
(?: # Not a DTP line
(?! ^ [ \t]* DTP\* \d{3} \*R?D \d \* )
.
)*
^ [ \t]* DTP\* \d{3} \*R?D \d \* # The very next 'DTP' line
(?: \3 | \d{8} - \3 ) # Number must be in one of these spots
.*? ^ [ \t]* REF\*6R # The ending
) # (4 end)
)
问题不在于开始,而在于结束。在您的第一个示例中,是什么使它越过
REF*6R*[
?你在寻找平衡的开始/结束吗?我不确定平衡的开始/结束是什么。我希望我在这方面能做得更好,但我学到的大部分东西都是在没有正式指导的情况下阅读网站。我现在正在阅读平衡的开始和结束,可能很快就会有答案。:)完全不清楚。请编辑你的问题,添加1)你想要复制的确切规则,2)两个例子,清楚地解释它们失败或成功的原因。我认为你为我指出了正确的方向。问题是我不知道我不知道什么。我会这样做吗?(?'open'(DTP*431*D8*)([0-9]{8}))+(?'-open DTP*472*\2)+@BartlebytheScrivener您的问题不够清楚,您能发布示例数据和预期输出吗?我希望我编辑的条目能够提供清晰的信息,但这与我的第一个示例有相同的问题。如果DTP*472*RD8*的第一个实例不匹配,它将继续搜索,直到找到一个匹配的实例。@BartlebytheScrivener-幸运的是,这就是exac这个正则表达式是做什么的。你检查了输出了吗?编辑:我想我遗漏了什么。它实际上是从我的生产文件中的一个不同的DTP段开始的,这让我很反感。我现在正在测试。我试着编辑它,只使用431开始,472结束,然后通过前472找到472的下一个实例有一个日期与第一个日期匹配。我也试着离开472,因为它只是\d{3}没有用。@Bartlebythestrivener-看看修改过的那个。
# (?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\*(?:\3|\d{8}-\3).*?^[ \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
( # (2 start), Part to be written back
(?: # 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
) # (2 end)
| ## Or,
^ [ \t]* DTP\* \d{3} \*R?D \d \*
\d{8} -
( \d{8} ) # (3), Checking "second" NUMBER spot
[^\r\n]* \r? \n # Grab the rest of this line
( # (4 start), Part to be written back
(?: # Not a DTP line
(?! ^ [ \t]* DTP\* \d{3} \*R?D \d \* )
.
)*
^ [ \t]* DTP\* \d{3} \*R?D \d \* # The very next 'DTP' line
(?: \3 | \d{8} - \3 ) # Number must be in one of these spots
.*? ^ [ \t]* REF\*6R # The ending
) # (4 end)
)