【问题标题】:How to extract multi-line text delimited by 2 strings如何提取由2个字符串分隔的多行文本
【发布时间】:2014-01-30 03:39:06
【问题描述】:

我有以下模式:

索赔(40)
这很好。
这也不错。
说明
这是描述。

本例中的分隔符字符串为:

第一个分隔符:“Claims(40)”
第二个分隔符:“描述”

我想在这些分隔符之间提取文本,同时排除分隔符。

此外,在上述文本中,存在以下规则:

  1. 第一个分隔符从文本的第一列开始,它是该行中唯一的单词。

  2. 在第一个分隔符中,左括号、数字组合和右括号可能不存在。但是,如果有左括号,则存在数字和右括号的组合。

  3. 第二个分隔符从文本的第一列开始,它是该行中唯一的单词。

我的正则表达式:

String regxStr = "^Claims(\\(\\d+\\)?)$(.*?)^Description$";

这不起作用。

我尝试了很多其他正则表达式,但没有一个起作用。所以最后,我使用了正则表达式的蛮力方法:

String regxStr = "Claims(.*?)Description";

但是这两个正则表达式都不起作用。我无法弄清楚 regx 出了什么问题以及哪里出了问题。 我正在使用 Matcher 类和 Matcher 类的 find() 方法进行进一步处理。

请帮帮我。

【问题讨论】:

    标签: java regex delimiter


    【解决方案1】:

    这会捕获您想要的文本,尽管我并不完全清楚您对 (40) 部分的要求。 @lovetostrike 的回答解决了这个问题。

    \bClaims(?:\(\d+\))?\s+(.+?)\s+Description\b
    

    编译模式时必须激活DOTALL标志:

    Pattern.compile(regxStr, Pattern.DOTALL)
    

    在 Java 字符串中转义:

    "\\bClaims(?:\\(\\d+\\))?\\s+(.+?)\\s+Description\\b"
    

    【讨论】:

    • 更准确地说,它不应该在转义的Java字符串中吗? "Claims\\(\\d+\\)\\s+(.*)\\s+Description"
    • 太好了,我使用了“\\bClaims\(\\d+\)\\s+(.+?)\\s+Description\\b”。只是稍微更正,在 aliterralmind 的解决方案中的 Claims\ 之后添加了 '\'。但是你能帮我理解我的正则表达式出了什么问题吗?
    • 很高兴为您提供帮助。请考虑通过单击大复选标记来选择此作为您的答案。祝你好运,欢迎来到 stackoverflow!
    • 不确定你的意思。 \bClaims\(?:\(\d+\))? ... 是错误的。数字周围的括号确实被转义了:\(\d+\)。也许您在谈论我的答案版本不正确,但此后已被编辑?刷新页面,再看看。为了回答您的问题,我认为缺少 DOTALL 是您的主要问题。
    【解决方案2】:

    这是一个单行解决方案:

    String target = input.relaceAll(".*Claims(\\(\\d+\\))?\\s+(.*?)Description.*", "$1");
    

    【讨论】:

      【解决方案3】:

      除了@aliteralmind 的答案之外,Regex 不是嵌套结构的好工具,即匹配括号对。但在您的简单情况下,您可以在模式中使用 OR、'|' 运算符。外部括号用于分隔 OR 运算符的两组,第一部分带括号,第二部分不带括号。

      (\\(\\d+\\)|\\d+)
      

      【讨论】:

      • 好吧,如果我从声明中删除带括号的文本,解决方案将失败。例如“Claims”而不是“Claims(40)”。这两种解决方案都发生了这种情况。
      • 你能澄清一下吗?请发布您使用的确切正则表达式和示例字符串。我测试了他们的解决方案,他们同时适用于“Claims”和“Claims(40)”
      • 我用的和你给的一样:\\bClaims(\(\\d+\)|\\d+)\\s+(.?)\\s+")Description\\b
      • 对不起,我误解了你的规则...... :D 他们的解决方案很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 2012-05-20
      • 1970-01-01
      • 2021-03-29
      • 2021-09-18
      • 2017-08-21
      • 1970-01-01
      相关资源
      最近更新 更多