【问题标题】:Regex to match anything between parenthesis正则表达式匹配括号之间的任何内容
【发布时间】:2018-04-04 04:57:46
【问题描述】:

我正在使用正则表达式将特定模式替换为更简单的模式。

我需要从两个括号之间取出所有字符,空格,并在捕获组中使用它们。但是,括号之间的字符也可能是括号。

以下是我尝试匹配的两个示例:

.message("vel pharetra est urna eget justo. Nunc in dignissim velit. {} "
        + error.getMessage().getProperty())
.build().log();   

.message("Key : " + oldEntry.getKey() + " and Value: " + oldEntry.getValue())
    .build()
    .log();

我当前的正则表达式:\.message\(([\S\s]+?)\)[\S\s]*?((\.log\(\))|(\.build\(\)))\;

当消息中没有括号时,它匹配简单的模式。但是当有括号时,它会在第一个右括号处停止捕获组。我确定这是因为我使用的是+?,但我不确定如何指定搜索应该继续。

我用几个例子创建了这个正则表达式。 http://regexr.com/3h15u

【问题讨论】:

  • 请标记一种语言。
  • 在你的两个例子中,你想匹配什么? message 的参数,或者从 .messagelog() 的所有内容?
  • 我只是表面上看,但根据 MDN,使用 ?在 *、+、? 或 {} 之后使捕获组不贪婪...
  • 我在技术上使用 Intellij 中的正则表达式替换功能,但找不到他们使用的实现的参考。
  • @tobias_k message的参数

标签: java regex


【解决方案1】:

你可以使用这个正则表达式:

\.message\((?s)(.+?)\)\s*(?:\.(?:log|build)\(\)\s*)+\s*;

() 之间的文本正在被捕获的组 #1 中捕获

RegEx Demo

在 Java 中使用:

final String regex = "\\.message\\((?s)(.+?)\\)\\s*(?:\\.(?:log|build)\\(\\)\\s*)+\\s*;";

【讨论】:

  • 这是正确匹配 message 参数,但我还需要匹配最后的 .log 或 .build (现在如果遇到一个或另一个它会停止。)我需要匹配我的替换工作的全部内容。
  • 太棒了,regex101 现在可能会成为我的默认工具,谢谢!
猜你喜欢
  • 2011-09-06
  • 2012-01-21
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2016-11-03
相关资源
最近更新 更多