【问题标题】:Regex Look-Behind for Right to Left eventRegex Look-Behind for Right to Left 事件
【发布时间】:2011-09-01 07:04:29
【问题描述】:

我正在提取以 Windows LogonID 结尾的事件...这意味着:

Special Privileges assigned to a new Logon: Logon Id: 0x007d

我认为这是最好的方法:

^(?<event>.+)(?<=ID:\s\d+x[A-F\d]+)$

使用 RegexOptions.RightToLeft 从字符串末尾开始搜索。

使用 lookbehind,如果 {ID: LogonId} 不存在,它将尽快失败。

由于我找不到任何好的从右到左测试仪,所以我在这里寻求您的帮助。

【问题讨论】:

  • 可能有助于提供一些示例数据...
  • 你有没有发现最简单的正则表达式在实践中太慢了,或者只是理论上太慢了?
  • 在实践中,我正在使用 RegexBuddy 调试器,问题是我无法以我想要的方式测试我的正则表达式,因为它不支持 RightToLeft 处理。
  • 我明白了。您是否按照以下 Alan Moore 的建议测试了正则表达式 您不想要的方式?它可能已经足够快了。

标签: .net regex lookbehind right-to-left


【解决方案1】:

你能得到比赛的位置吗?在 Perl 中,可以这样做:

if ($str =~ /ID:\s\d+x[A-F\d]+$/i)
   say substr($str, 0, $-[0]);  # $-[0] is the starting pos of the match.
}

if ($str =~ /ID:\s\d+x[A-F\d]+$/ip)
   say ${^PREMATCH};
}

【讨论】:

  • 其实我需要正则表达式进行比较,而不是提取目的。我将它与 GroupByEvaluator 一起用于 Infragistics Grid。
  • @celerno,如果你不需要提取,为什么不使用最快的/^.*ID:\s\d+x[A-F\d]+$/i(l-to-r 和 r-to-l)和/ID:\s\d+x[A-F\d]+$/i(l- to-r 和 r-to-l)。
  • 抱歉,我上次的评论有误。事实上,我会提取,因为我需要将除 (ID: 0x007d) 之外的所有文本与另一个具有其他 ID 的文本进行比较,比如说 ID:0x008x。主要问题是找到具有最佳性能的确切模式 ID:0x008x……如果不匹配,则无法尽快找到。如果我不能正确测试我的正则表达式,索引可能会很棒。谢谢你的想法。
【解决方案2】:

我不明白您为什么需要 RightToLeft 选项向后看。您是否使用这样的正则表达式对其进行了测试:

(?i)^(?<event>.+)ID:\s\d+x[A-F\d]+$

...发现它太慢了?

【讨论】:

  • 嗯,我正在尝试 RightToLeft,因为我正在寻找以“ID:0x0074”结尾的字符串。最佳性能是这里的关键。此正则表达式用于对 100,000 个网格进行排序和分组。
  • 好吧,如果您有一个接近 400 个字符的文本日志,并且此事件有一个 ID:某处,处理器将从头到尾尝试查找静态模式 ID:和动态模式 \s\dx[AF\d]+$
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 2020-02-07
  • 1970-01-01
  • 2014-09-12
  • 2022-12-02
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多