【问题标题】:Why is this regex not matching like the other?为什么这个正则表达式与另一个不匹配?
【发布时间】:2012-11-07 08:43:56
【问题描述】:

我正在尝试在以下示例中匹配@@BOKeyword--End@@ 之间的最里面的内容:

@@BOKeyword-Here is@@BOKeyword-I want to match this!-End@@stuff-End@@

所以我的匹配是:I want to match this! 我正在使用以下正则表达式:@@BOKeyword-([^@@BOKeyword--End@@]*)-End@@

但是,这根本不匹配。我是根据这个例子开发的,这个例子来自a previous question's answer

AC I want to match this! BD I don't want to match this! AC I want to match this! BD I don't want to match this! BD

使用正则表达式:AC([^ACBD]*)BD

这按预期工作。我想我误解了这是如何工作的。任何提示将不胜感激!谢谢!

注意:我在 Java 中运行它。

【问题讨论】:

  • [] 组一次匹配(正向或负向)一个字符。不是整个字符串。所以[^ABCD]实际上是指不是A、B、C或D的单个字符。

标签: regex


【解决方案1】:

如果你的正则表达式引擎支持lookaround,你可以试试这个:

(?<=@@BOKeyword-).((?<!@@BOKeyword-).(?!-End@@))*.(?=-End@@)
  • 第一个DOT 匹配起始字符:I
  • 中间的DOT 匹配没有被分隔符包围的字符:·want·to·match·this
  • 最后一个DOT 匹配结束字符:!

有 2 种情况没有覆盖(中间只有一个/零字符):

(?<=@@BOKeyword-).?(?=-End@@)

很难将这两个正则表达式结合起来。另一种方法是:

  • 将分隔符替换为{/}(或其他单个字符对)
  • 写一个更简单的正则表达式来匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 2020-11-27
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2014-05-14
    相关资源
    最近更新 更多