gpt4 book ai didi

java - 如何使用 Java 在我的字符串中找到第一个 "element"的索引?

转载 作者:行者123 更新时间:2023-11-30 06:39:04 26 4
gpt4 key购买 nike

我正致力于用 Java 编写一个简单的 Prolog 解释器。

如何在“列表语法”中找到字符串的头元素或尾元素的第一个元素的最后一个字符索引?

列表语法如下:

(X)
(p a b)
(func (func2 a) (func3 X Y))
(equal eve (mother cain))

每个字符串的头部依次是:
头部:“X”,索引:1
头部:“p”,索引:1
头部:“func”,索引:4
头部:“等于”,索引:5

基本上,我需要匹配紧跟在第一个“(”之后并以空格或结束符“)”结尾的字符串,以先到者为准。我需要头元素最后一个字符的字符索引。

如何在 Java 中匹配并获取该索引?


Brabster 的解决方案非常接近。但是,请考虑以下情况:
((b X) Y)

其中head元素是(b x)。我试图通过从扫描仪分隔符中删除“(”来修复它,但由于“b”和“x”之间的空格,它仍然会出现问题。

同样:((((b W) X) Y) Z)

头部是 (((b w) x) Y)。

最佳答案

Java 的 Scanner类(在 Java 1.5 中引入)可能是一个很好的起点。

这是一个我认为可以满足您要求的示例(已更新以包括字符计数功能)

public class Test {

public static void main(String[] args) {

String[] data = new String[] {
"(X)",
"(p a b)",
"(func (func2 a) (func3 X Y))",
"(equal eve (mother cain))",
"((b X) Y)",
"((((b W) X) Y) Z)"
};


for (String line:data) {
int headIdx = 0;
if (line.charAt(1) == '(') {
headIdx = countBrackets(line);
} else {
String head = "";
Scanner s = new Scanner(line);
s.useDelimiter("[)|(| ]");
head = s.next();
headIdx = line.indexOf(head) + head.length() - 1;
}
System.out.println(headIdx);
}

}

private static int countBrackets(String line) {
int bracketCount = 0;
int charCount = 0;
for (int i = 1; i < line.length(); i++) {
char c = line.charAt(i);
if (c == '(') {
bracketCount++;
} else if (c == ')') {
bracketCount--;
}
if (bracketCount == 0) {
return charCount + 1;
}
charCount++;
}
throw new IllegalStateException("Brackets not nested properly");
}
}

输出:

1
1
4
5
5
13

这不是一个非常优雅的解决方案,但正则表达式不能计数(即括号)。如果那里有更多的复杂性,我会考虑使用解析器生成器:)

关于java - 如何使用 Java 在我的字符串中找到第一个 "element"的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1440748/

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