gpt4 book ai didi

java - java中匹配子字符串

转载 作者:行者123 更新时间:2023-11-30 03:51:40 25 4
gpt4 key购买 nike

我有一个存储在数组列表中的输入数据。迭代列表时输出为

Input ----------- [0 Overcast 1 High 2 Normal 3 Weak ]
Input ----------- [0 Rainy 1 Mild 2 High 3 Strong ]
Input ----------- [0 Rainy 1 Mild 2 Normal 3 Weak ]

并在另一个数组列表中规则

Rule -----------[ 0 Overcast Yes, 0 Rainy 3 Strong No, 0 Rainy 3 Weak Yes, 0 Sunny 2 High No, 0 Sunny 2 Normal Yes]

我期望输出为

[0 Overcast 1 High 2 Normal 3 Weak Yes]
[0 Rainy 1 Mild 2 High 3 Strong No]
[0 Rainy 1 Mild 2 Normal 3 Weak Yes]

通过研究规则集,我必须向输入添加标签。为此,我尝试在输入和规则集之间进行匹配

for(String ruleSet : addRule){ //ruleset
for(String lineSet : getLine){ //inputline
if (lineSet.matches("(.*)"+ruleSet+"(.*)")) {
System.out.println("got----------------"+lineSet+"***"+ruleSet);
break;
}
else{
System.out.println("Not found----------------"+lineSet+"***"+ruleSet);
}
}
}

但我的结果是like this

0 Overcast 1 High 2 Normal 3 Weak Yes0 Overcast Yes 不匹配。尽管它是一个子集。

我是不是做错了什么?

最佳答案

如果我理解正确的话,你有两个String列表:

  1. getLine 是表示输入行的字符串列表
  2. addRule 是表示规则集的字符串列表。

每个规则包含需要与输入行匹配的多个部分,以及匹配时应使用的结果。

(您似乎将此结果称为“类路径”,尽管该术语在 Java 上下文中具有非常具体的含义)。

所以这一行:

0 Overcast 1 High 2 Normal 3 Weak

将与规则匹配

0 Overcast

因为它包含子字符串“0 Overcast”,但也违反了规则:

0 Overcast 3 Weak

因为该行包含子字符串“0 Overcast”和“3 Weak”,即使整个规则没有作为子字符串出现在该行中。

我猜您正在寻找的是子集搜索,并且可能看到 this answer并尝试使用它,但是在字符串之间进行子集匹配很复杂,并且可以使用正则表达式,但比您尝试的要棘手一些,所以我建议尝试使用更简单的解决方案。

具体来说,仅执行 .matches("(.*)"+ruleSet+"(.*)") 不会达到您想要的效果。

如果我对您问题的解释是正确的,请在评论中告诉我,我会尽力帮助您找到解决方案。

继续

因此,假设您可以控制规则集,我可能会创建一个如下所示的 Rule 类:

public class Rule {
public List<String> parts;
public String result;

public Rule(String result, String... parts) {
this.parts = new ArrayList<>();
for(String part : parts) {
this.parts.add(part);
}
this.result = result;
}

public String match(String line) {
for(String part : parts) {
if (!line.contains(part)) return null;
}
return result;
}
}

注意match是如何实现的:如果任何部分不匹配,则匹配失败。

(我使用 varargs 作为构造函数,但如果需要,您可以只传递一个列表)。

然后您可以像这样初始化规则集:

List<Rule> ruleSet = new ArrayList<>();
ruleSet.add(new Rule("Yes", "0 Overcast"));
ruleSet.add(new Rule("No", "0 Rainy", "3 Strong"));
ruleSet.add(new Rule("Yes", "0 Rainy", "3 Weak"));
...

当您违反规则进行循环时,如果没有匹配,则调用 match 来获取 null,如果有匹配,则调用结果。

for(Rule rule : ruleSet) {
for(String line : getLine) {
String result = rule.match(line);
if (result != null) {
...
<小时/>

或者,您可以将规则编写为正则表达式,如下所示:

String rule = ".*0 Rainy.*3 Strong.*";
if(line.matches(rule)) {
...

但是在您有时间了解正则表达式之前,您可能应该避免使用它们。它们是强大的工具,但有许多警告。

<小时/>

如果您需要将规则集保留在文本文件中,那么您将必须编写一个方法来将这些行转换为 Rule 对象,可能作为不同的构造函数。这是一种方法:

public class Rule {
...
public Rule(String line) {
this.parts = new ArrayList<>();
String number = null;
for (String s : line.split()) {
if (s.equals("Yes") || s.equals("No")) {
this.result = s;
return;
}
if (number == null) {
number = s;
} else {
this.parts.add(number + " " + s);
number = null;
}
}
}

关于java - java中匹配子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24279310/

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