【问题标题】:How to extract a string after and before a specific word using Java regular expression如何使用Java正则表达式在特定单词之后和之前提取字符串
【发布时间】:2017-12-13 18:19:08
【问题描述】:

我需要在opResult 之后和另一个字符串(word+'=')之前提取一个字符串

例如:

testest=false opResult=不支持关键扩展 random=abc srcPort=10

所以我应该在下一个带等号的单词之前提取Critical extension not supported

另外,如果后面没有其他字符串,它也应该工作,这意味着我应该得到与下面的示例相同的结果。

typesOnly=false opResult=不支持关键扩展

我目前提取了最后一个 '=' 符号之前的所有内容的正则表达式。

opResult=(\S.*)(\s\w+=)

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您应该使用积极的后视和积极的前瞻以及中间文本的惰性量词

    (?<=opResult=).*?(?=\s*\S*=)
    

    你可以在regex101看到结果。

    【讨论】:

    • 它不应该抓取随机词,只应该得到“不支持关键扩展”
    • @Kaycee 没看到,但是给你。
    【解决方案2】:

    我们需要在 'opResult=' 之后的下一个空格 (\s)word(\w+) 之后查找文本,后跟等号 (?==) 和后面的 (.*)

    图案变成

    .*opResult=([\w|\s]+)(\s\w+(?==).*)
    

    这是Regex101的链接

    【讨论】:

      【解决方案3】:

      我们可以尝试使用以下模式进行匹配/提取:

      .*opResult=(.*?)(?:\\s*\\S+=.*|$)
      

      这里的诀窍是能够在下一个键开始时发音,然后不提取它。

      String line = "testest=false opResult=Critical extension not supported random=abc srcPort=10";
      String pattern = ".*opResult=(.*?)(?:\\s*\\S+=.*|$)";
      Pattern r = Pattern.compile(pattern);
      Matcher m = r.matcher(line);
      if (m.find( )) {
          System.out.println(m.group(1));
      }
      

      输出:

      Critical extension not supported
      

      演示在这里:

      Rextester

      【讨论】:

      • 它只有在后面有字符串的情况下才有效,但如果后面没有字符串也应该有效。
      • 我刚刚更新以涵盖opResult 是字符串中的最后一个键的情况。除此之外,我不知道你的意思。
      • 是的,这就是我想要的!谢谢!!
      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多