JAVA 字符串中带换行符的最长模式匹配

标签 java regex pattern-matching line-breaks

如何匹配具有换行符的字符串中的模式? 例如

requisition({"title":"my json",
             "items" : [{ "A": "a",
                          "B": "b"}
                       ]
            })

我只想捕获这个

{"title":"my json",
             "items" : [{ "A": "a",
                          "B": "b"}
                       ]
}

我尝试过类似的方法

String pattern = ".*(\\{.*\\}).*";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);

但是没有成功。有什么建议吗?

只是为了说得更清楚。这是我的input

最佳答案

使用单个 JSON 对象作为输入的问题很简单:您的第一个 .* 是贪婪的。因此它会消耗所有内容,直到最后一个 { 后面仍然跟着 }。如果您使 .* 变得不贪婪(或将其遗漏),您应该获得完整的 JSON 对象:

String pattern = ".*?(\\{.*\\}).*";

但是您可以(并且应该)完全省略开头和结尾的重复:

String pattern = "\\{.*\\}";

那么您甚至不需要捕获任何东西。请注意,这必须与 find 一起使用,而不是与 matches 一起使用。

但是,您的输入有多个 JSON 对象。这就是正则表达式出现问题的地方。某些引擎支持允许正确嵌套括号的结构(以检查哪些括号实际上属于一起)。但这些正则表达式很容易变得丑陋且不可维护。

您最好手动遍历字符串,并记录当前的嵌套级别。每当您返回顶层时,您只需切断一个子字符串(从相应的左括号到当前位置)。

关于JAVA 字符串中带换行符的最长模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573432/

相关文章:

java - 创建与 WildFly 10 和 Jaybird 3.0 的连接失败

java - Azure Blob - 并行上传非常大的文件

linux - 模式搜索 Grep

r - 创建匹配模式的数据帧列表

java - 我需要不断地将数据从 Android 中的一项 Activity 发送到另一项 Activity

java - 如何正确使用鼠标监听器?

python - 从已编译的 re 中获取模式?

php - 如何在mysql数据库中插入新字段

java - 使用正则表达式区分字符串中的斜杠

python - 使用模式作为字典键