使用编码的双引号解析简单属性

时间:2013-03-04 10:01:42

标签: java regex

我正在使用Regex

解析Java中的一些文本

我的字符串看起来像这样:myAttribute =“some text”,我正在解析它们

Pattern attributePattern = Pattern.compile("[a-z0-9]*=\"[^\"]*\"");

但是,我意识到人们可能想在其属性值中使用双引号。

e.g。 myAttribute =“带有双引号的文字”“这里”

如何调整我的正则表达式以处理此

这是我解析属性的代码

private HashMap<String, String> findAttributes(String macroAttributes) {
    Matcher matcher = attributePattern.matcher(macroAttributes);
    HashMap<String, String> map = new HashMap<String, String>();
    while (matcher.find()) {
        String attribute = macroAttributes.substring(matcher.start(), matcher.end());
        int equalsIndex = attribute.indexOf("=");
        String attrName = attribute.substring(0, equalsIndex);
        String attrValue = attribute.substring(equalsIndex+2, attribute.length()-1);
        map.put(attrName, attrValue);
    }
    return map;
}

findAttributes("my=\"some text with a double quote \\\" here\"");

应返回大小为1的地图 值应该是一些带有双引号的文本\“这里

2 个答案:

答案 0 :(得分:1)

您可以为该

使用替换和正向后看断言
Pattern attributePattern = Pattern.compile("[a-z0-9]*=\"(?:[^\"]*|(?<=\\\\)\")*\"");

(?:[^\"]*|(?<=\\\\)\")*是一项更改,与[^\"]*(?<=\\\\)\"匹配

(?<=\\\\)\"匹配一个“,但前提是它有一个强烈反对。

答案 1 :(得分:1)

您可以使用负面看后面来查看引号之前是否有反斜杠,但如果反斜杠本身也可以转义,则会失败:

myAttribute="some text with a trailing backslash \\"

如果可以的话,尝试这样的事情:

Pattern.compile("[a-zA-Z0-9]+=\"([^\"\\\\]|\\\\[\"\\\\])*\"")

快速解释:

[a-zA-Z0-9]+     # the key
=                # a literal '='
\"               # a literal '"'
(                # start group
  [^\"\\\\]      #   any char except '\' and '"'
  |              #   OR
  \\\\[\"\\\\]   # either '\\' or '\"'
)*               # end group and repeat zero or more times
\"               # a literal '"'

快速演示:

public class Main {

    private static HashMap<String, String> findAttributes(Pattern p, String macroAttributes) {
        Matcher matcher = p.matcher(macroAttributes);
        HashMap<String, String> map = new HashMap<String, String>();
        while (matcher.find()) {
            map.put(matcher.group(1), matcher.group(2));
        }
        return map;
    }

    public static void main(String[] args) {
        final String text = "my=\"some text with a double quote \\\" here\"";
        System.out.println(findAttributes(Pattern.compile("([a-z0-9]+)=\"((?:[^\"\\\\]|\\\\[\"\\\\])*)\""), text));
        System.out.println(findAttributes(Pattern.compile("([a-z0-9]*)=\"((?:[^\"]*|(?<=\\\\)\")*)\""), text));
    }
}

将打印:

{my=some text with a double quote \" here}
{my=some text with a double quote \}