gpt4 book ai didi

java - 有没有办法指定一个不匹配任何其他正则表达式的正则表达式?

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

假设我有这样的东西:

    pattern = new Pattern[6];
pattern[0] = Pattern.compile("^\\s*(NAME\\:\\s*)\\s(\\w+)");
pattern[1] = Pattern.compile("^\\s*(AGE\\:\\s*)\\s(\\d+)");
pattern[2] = Pattern.compile("^\\s*(ADDRESS\\:\\s)(\\w+)");
pattern[3] = Pattern.compile("^\\s*(BIRTHDAY\\:\\s)(\\d+)\\:(\\d+)\\:(\\d+)");
pattern[4] = Pattern.compile("(?=\\s*\\*)(^\\**)");
pattern[5] = Pattern.compile("\\S+|[^\\s*.+\\s*]");

模式 4 的要点是捕获后跟 * 的注释,而模式 5 是捕获其他模式无法捕获的所有其他内容。然后 Matcher dp 将检查模式是否是 LookAhead 返回 true 或 false 所预期的模式。

    public boolean lookAhead () {
while ((line = buff.readLine()) != null) {
Pattern different = Pattern.compile("^[^(\\s*NAME.*)(\\s*AGE.*)(\\s*ADDRESS.*)(\\s*BIRTHDAY.*)]");
Matcher comment = pattern[4].matcher(line);
Matcher diff = different.matcher(line);
Matcher name = pattern[0].matcher(line);
if (comment.find() || different.find() /*|| name.find()*/)
continue;
Matcher dp = pattern[0].matcher(line);
dpla = dp.find();
break;
}
}
return dpla;
}

评论被忽略,所有随机错误如:“feifiejfie”也会被忽略。但是,如果文本类似于“NAME 7987997 GSGSGE 456”,这应该被视为错误,但事实并非如此。如果 name.find 未注释,它将始终有效,但永远不会返回 false。

最佳答案

让我们简单地尝试一些不同的方法。我认为,本质上,您有一些输入字符串;然后你有一个不同的正则表达式列表,这些正则表达式可能包含你感兴趣的匹配器。你在代码中做了很多匹配,最终只返回一个 boolean 值;这似乎没有用;所以我会给你一个想法如何以不同的方式做事。

 class RegexListMatcher {
private final Map<String, Pattern> patternsById;
private final String inputToMatchOn;

private final String matchingId;
private final String matchResult;

RegexListMatcher(Map<String, Pattern> patternsById, inputToMatchOn) {
this.patterns... = patterns
this.input... = input

matchingId = findMatchingId();
if (matchingId == null) {
matchResult = null;
} else {
matchResult = getMatchResult();
}
}

private final String findMatchingId() {
for (Entry<String, Pattern> entry : patternsById) {
if entry.value matches the given input return entry.key

otherwise return null
}

private final String getMatchResult() {
Pattern pattern = patternsById.get(matchingId);
return the value matched within input
}

public boolean hasMatch() { return matchingID != null; }
public String getMatchId() ...
public String getMatchResult() ...

像这样使用:

 private final static Map<String, Pattern> RULES = new HashMap<>();
RULES.put("NAME", Pattern.compile("^\\s*(NAME\\:\\s*)\\s(\\w+)"));
...

RegexListMatcher listMatcher = new RegexListMatcher(RULES, someInputString);
if (listMatcher.hasMatch()) {
one of the rules matched
} else {
no match at all
}

我实现的关键点:你有一个潜在模式的列表;如果其中一个匹配,您肯定对输入中匹配的值感兴趣。令人惊讶的是:如果没有任何模式匹配,那么您也知道这一点。因为 RegexListMatcher 可以告诉您。

当然,代码比你的多;但是例如:根本没有对某个数组索引的任何硬编码访问。显然,以上是部分伪代码,但我想它应该足以让您入门。

关于java - 有没有办法指定一个不匹配任何其他正则表达式的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39482643/

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