【问题标题】:Finding a pattern with optional end using regular expression使用正则表达式查找具有可选结尾的模式
【发布时间】:2015-09-02 08:37:20
【问题描述】:

我正在寻找一个正则表达式来提取一段文本,该文本块可以用可选的结尾包围。这里的挑战只是使用一个正则表达式。

输入如下:

Anchor:  This is the text I want to extract          A/C  : 2015-5-20
Anchor:  This is the text I want to extract        

我目前正在使用以下正则表达式

Anchor:(?<extact>.*)(A\/C)

结果如下:

如果我将 A/C 块设为可选,Anchor:(?&lt;extact&gt;.*)(A\/C)? 使用 ? 匹配会变长:

如下所示:

任何想法如何用一个正则表达式优雅地解决这个问题。另一个约束是我想在正则表达式中有一个命名块,(这里是extact

您可以在 regex101 上找到示例代码:https://regex101.com/r/wH5iQ4/1

【问题讨论】:

  • 您能否也发布您正在寻找的确切匹配项?我的意思是首选输出。我不确定我是否完全理解您在这里想要实现的目标。
  • A/C前面的空格是否一致?
  • A/C前的空格不一致,但也不相关。我的意图是提取从 Anchor:A/C 或直到行尾的所有内容(包括空格)
  • 为什么不直接使用捕获的文本 1?就性能而言,环视总是更昂贵。使用 Anchor:(?&lt;extact&gt;.*?)(\s*A\/C) 并获取第 1 组文本。确实,这不是您必须使用环视的情况。

标签: regex match string-matching


【解决方案1】:
Anchor:(?<extact>.*?)\s*(?=A\/C|$)

您可以在这里使用lookahead。查看演示。

https://regex101.com/r/wH5iQ4/3

【讨论】:

  • 稍微好一点:Anchor:(?&lt;extact&gt;.*?)(?=\s*A\/C|\s*$)
  • 有什么办法可以避免将子表达式从 ´(?.*)´ 更改为 (?&lt;extact&gt;.*?) ?在我生成正则表达式的应用程序逻辑中,这个子表达式应该保持静态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多