gpt4 book ai didi

尽管调试工具匹配,但 Java 正则表达式不匹配

转载 作者:行者123 更新时间:2023-12-01 08:11:18 24 4
gpt4 key购买 nike

我编写了一个正则表达式来解析格式的字符串

OBJECT_NAME KEY1=值 KEY2=值

(实际上由 2 个正则表达式完成)

这是我的 utils 类:

package de.hs.settlers.util;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ParseUtils {
public static final Pattern OBJECT_NAME_PATTERN =
Pattern.compile("^([A-Z0-9 ]+) ([A-Z]+=.+)$");
public static final Pattern KEY_VALUE_PATTERN =
Pattern.compile("^([A-Z0-9]+)=([^=]+)( [A-Z]+=.+)?$");

public static ParseResult parseKeyValueLine(String line) {
Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);
HashMap<String, String> data = new HashMap<String, String>();

String vals = object.group(2);
do {
Matcher matcher = KEY_VALUE_PATTERN.matcher(vals);

if (!matcher.matches()) {
break;
}

String key = matcher.group(1);
String value = matcher.group(2);
data.put(key, value);
vals = matcher.group(3);
if (vals != null) {
vals = vals.trim();
}
} while (vals != null);

return new ParseResult(objectName, data);
}

public static class ParseResult {
private String objectName;
private HashMap<String, String> data;

public ParseResult(String objectName, HashMap<String, String> data) {
super();
this.objectName = objectName;
this.data = data;
}

public String getObjectName() {
return objectName;
}

public HashMap<String, String> getData() {
return data;
}

public String get(String key) {
return getData().get(key);
}
}
}

我编写了一个测试,以“USER TEAM=Team A USER=tuxitux OTHER=bla”作为行参数来测试 parseKeyValueLine 方法,但执行失败,因为第一个表达式(OBJECT_NAME_PATTERN 中的表达式)显然没有执行匹配。

我遇到的问题是,当我将表达式和字符串粘贴到正则表达式调试器中进行测试时,它们都告诉我它匹配并给我正确的组。 (使用 http://gskinner.com/RegExr/http://www.debuggex.com/ 进行测试)。

java处理正则表达式的方式有什么问题吗?

最佳答案

问题出在这里:

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);

您创建了匹配器,但没有告诉它实际对字符串进行工作。因此,即使有匹配,您也没有可用的组。

您需要调用匹配方法之一(.find().lookingAt().matches(),但是所有这三个对您来说都是等效的,因为您的正则表达式都锚定在输入的开头和结尾),然后收集组。

示例(.find()):

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
object.find(); // or you could have an if statement here
String objectName = object.group(1);

关于尽管调试工具匹配,但 Java 正则表达式不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086508/

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