【问题标题】:Java Regex Find All Between But Last Character Not Preceded Or Followed ByJava 正则表达式查找所有字符之间但最后一个字符之前或之后没有
【发布时间】:2013-10-19 02:19:57
【问题描述】:

我有一个字符串:"stuffhere{@ name="productViewer" vars="productId={{id}}"}morestuff"

如何找到开头 { 和结尾 } 之间的所有内容。

Pattern.compile("\\{@(.*?)\\}" + from, Pattern.DOTALL); //Finds {@ name="productViewer" vars="productId={{id}

如何验证结尾 } 之前或之后没有另一个 }?该字符串也可能被其他字符包围。

我希望正则表达式只返回:name="productViewer" vars="productId={{id}}"

【问题讨论】:

  • 去掉不情愿的量词。制作是.*

标签: java regex


【解决方案1】:

你可以使用这个模式:

\\{@(.*)(?<!\\})\\}

(?&lt;!..) 是检查您的条件(前面没有}

注意,右大括号不需要转义,可以这样写:

\\{@(.*)(?<!})}

【讨论】:

  • 有效。我曾尝试使用前瞻/后视,但我定位错误。
  • 天哪。为什么那些不必要的环顾四周? .* 贪婪会自动消耗最后的}
  • 不知道为什么,只是简单地删除不情愿的量词对我不起作用......@RohitJain
  • @ryandlf 你是如何使用它的。使用 (\\{.*}) 应该为您提供从第一个 { 到最后一个 } 的内容。
  • 嗯...我会玩弄它并通过删除 ? 来测试它。谢谢你的建议。上面的正则表达式工作正常,但我同意,如果我可以简化它。更好。
【解决方案2】:

试试这个:

 ^[^{]*\\{@(.*?)\\}[^}]*$

【讨论】:

    【解决方案3】:

    怎么样

    (?<=[{])[^{}]+
    

    我从未使用过 java,但正则表达式是国际化的,不是吗:)

    编辑:

    等等...正则表达式有错误...

    【讨论】:

      【解决方案4】:

      试试这个:

          String s = "stuffhere{@ name=\"productViewer\" vars=\"productId={{id}}\"}morestuff";
          Pattern p = Pattern.compile("\\{@\\s+(.*)\\}");
          Matcher m = p.matcher(s);
          if(m.find()){
              System.out.println(m.group(1));
          }
      

      【讨论】:

        猜你喜欢
        • 2018-04-10
        • 2017-08-03
        • 2019-01-21
        • 1970-01-01
        • 2022-11-20
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多