gpt4 book ai didi

Java:哪个解析器最适合根据括号对匹配文本?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:06:40 26 4
gpt4 key购买 nike

字符串示例:

“(这是 1 级。(这是 2 级。(这是 3 级。)回到 2 级。)回到 1 级。)”

如果事先不知道会有多少级括号(即第 3 级中可能有第 4、5、6 级等),我的理解是正则表达式不可能匹配上例中的 2 级文本。因此,对于此示例,无法使用正则表达式匹配以下内容:

“(这是 2 级。(这是 3 级。)回到 2 级。)”

我读过有关使用解析器执行此操作的信息,但我不确定哪个是最好的。我会寻找易用性、速度和与 Java 的兼容性。如有任何帮助,我们将不胜感激。

最佳答案

去年我自己也做过这样的事情。

这很简单,您首先搜索最后一个 ( 并存储索引。然后在存储索引后搜索第一个 )。你只需要一个子字符串来提取这两个索引之间的文本并完成:)

对于下一个级别,使用上一个索引来查找上一个/下一个(/) 并且你有一个简单的解析;)

这是打印每个级别的简单代码示例:

public static void main(String... args) {
String s = "(This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.)";
searchInto(s);
}

public static void searchInto(String s){
searchInto(s, s.length(), 0);
}

public static void searchInto(String s, int from, int to){
int nextOpen = s.lastIndexOf("(", from-1);
if(nextOpen >= 0){
int nextClose = s.indexOf(")", to);

System.out.println(s.substring(nextOpen + 1, nextClose));
searchInto(s, nextOpen, nextClose + 1);
} else
return;
}

将打印:

This is level 3.
This is level 2. (This is level 3.) Back to level 2.
This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.

编辑:

这应该涵盖更多领域。这将搜索内部 block 和彼此靠近的 block 。

public static void main(String... args) {
searchInto("(This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.)");
searchInto("(L1) (L2) (L3)");
searchInto("(L1) (L2 (L2a)) (L3)");
}

public static void searchInto(String s){
searchInto(s, s, s.length(), 0);
}

public static void searchInto(String s, String original, int from, int to){
int nextOpen = s.lastIndexOf("(", from);
if(nextOpen >= 0){
int nextClose = s.indexOf(")", nextOpen);
String tmp = original.substring(nextOpen + 1, nextClose);
System.out.println(tmp); //Print the result, use a List to store or treat it directly.
s = s.substring(0, nextOpen) + "#" + s.substring(nextOpen + 1, nextClose) + "#" + s.substring(nextClose + 1);
searchInto(s, original, nextOpen - 1, nextClose + 1);
} else
return;
}

将输出:

This is level 3.
This is level 2. (This is level 3.) Back to level 2.
This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.

L3
L2
L1

L3
L2a
L2 (L2a)
L1

通过使用替代字符串替换已找到的字符,我防止代码卡在索引上。但是我打印原始值以打印正确的值(没有用于替换已找到的 ( )# 字符)

这有点贵,所以如果您需要涵盖每个结构,这确实是个好主意。

关于Java:哪个解析器最适合根据括号对匹配文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38633795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com