我需要通过以下方式在大文本中找到这些组:
起始字是:开始 包含的单词是: 536916223 结束语是:结束
在文本的底部,我需要找到2组..
我试过用:
\bbegin.*(\n*.*)*536916223(\n*.*)*\bbegin
但如果我尝试在网站上使用之前的正则表达式" http://regexr.com/" 它以超时响应......我认为正则表达式不是很好:(
案文是:
begin active link
export-version : 11
actlink-order : 2
wk-conn-type : 1
schema-name : HelpDesk
actlink-mask : 1
actlink-control: 750000002
enable : 1
action {
set-field : 0\536916222\101\4\1\1\
}
errhandler-name:
end
begin active link
export-version : 11
actlink-order : 2
wk-conn-type : 1
schema-name : HelpDesk
actlink-mask : 1
actlink-control: 610000092
enable : 1
permission : 0
action {
id : 536916223
focus : 0
access-opt : 1
option : 0
}
action {
set-field : 0\536916222\101\4\1\1\
}
errhandler-opt : 0
errhandler-name:
end
begin active link
actlink-order : 12
wk-conn-type : 1
schema-name : HelpDesk
actlink-mask : 2064
enable : 1
permission : 0
action {
id : 536916223
focus : 0
access-opt : 1
option : 0
}
action {
set-field : 0\536916222\101\4\1\1\
}
errhandler-opt : 0
errhandler-name:
end
有人可以建议我为这项工作优化正则表达式吗?
此致 蒙特拉
答案 0 :(得分:2)
使用展开的tempered greedy token:
/\bbegin.*(?:\n(?!begin|end(?:$|\n)).*)*\b536916223\b.*(?:\n(?!begin|end(?:$|\n)).*)*\nend/g
或更短版本,如果我们添加MULTILINE
修饰符:
/^begin.*(?:\n(?!begin|end$).*)*\b536916223\b.*(?:\n(?!begin|end$).*)*\nend$/gm
请参阅regex demo(a version with MULTILINE modifier)
详细:
\bbegin
- 一个单词begin
(可以在其后添加单词边界\b
以确保匹配).*
- begin
(?:\n(?!begin|end(?:$|\n)).*)*
- 展开的驯化贪婪令牌(?:(?!\n(?:begin|end(?:$|\n)))[\s\S])*
匹配任何序列,但在行的开头begin
和end
作为整行\b536916223\b
- 整个单词536916223
.*
- 数字后面的其余部分(?:\n(?!begin|end(?:$|\n)).*)*
- 另一个展开的驯化贪婪令牌\nend
- 换行符之后的end
字词(可以在确定匹配后添加(?:$|\n)
)答案 1 :(得分:0)
.*(\n*.*)*
部分有点复杂,导致许多回溯。
由于.
与空格字符不匹配,因此我们可以使用全局通配符(例如[\S\s]
)来匹配任何字符。另一种可能的改进(以及可能的纠正)是使用惰性匹配,即*?
以下模式似乎工作正常
\bbegin[\S\s]*?536916223[\S\s]*?\bend
答案 2 :(得分:0)
正则表达式(设置m
修饰符):
^begin(?:(?!^end)[\s\S])*?536916223[\s\S]*?end
说明:
^begin # Match `begin` at start of line
(?: # Start of non-capturing group (a)
(?!^end)[\s\S] # A character which is not followed by `end` delimiter
)*? # Zero or more times (un-greedy)
536916223 # Up to special word
[\s\S]*? # Match any other characters
end # Up to first `end` delimiter
更高效的版本 - (设置m
修饰符):
^begin.*(?:\n(?!^end).*)*536916223(?:.*\n)*?^end