用正则表达式在bin文本中搜索组

时间:2016-09-09 14:09:32

标签: regex

我需要通过以下方式在大文本中找到这些组:

  • 定义组开头的单词
  • 小组中包含的Word
  • 定义组群完成的单词

起始字是:开始 包含的单词是: 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

有人可以建议我为这项工作优化正则表达式吗?

此致 蒙特拉

3 个答案:

答案 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])*匹配任何序列,但在行的开头beginend作为整行
  • \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

Live demo

更高效的版本 - (设置m修饰符):

^begin.*(?:\n(?!^end).*)*536916223(?:.*\n)*?^end

Live demo