【问题标题】:Java Regex doesn't match although debug tools doJava Regex 不匹配,尽管调试工具匹配
【发布时间】:2013-06-13 11:58:01
【问题描述】:

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

OBJECT_NAME KEY1=值 KEY2=值

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

这是我的实用程序类:

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做正则表达式有什么问题吗?

【问题讨论】:

  • 我在你的 RE 模式中看不到下划线
  • @fge 哦,谢谢,成功了。
  • @Izzy 下划线与 ([^=]+) 匹配,表示“一个或多个不是 '=' 的字符”。

标签: java regex


【解决方案1】:

问题出在这里:

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);

【讨论】:

  • +1:你的答案是正确的。我冒昧地添加了一个例子。不同意就回滚,我当然不介意。
【解决方案2】:

确保您没有任何监视表达式。对我来说,是 IDE watch 表达式导致了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2016-06-28
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多