带括号的正则表达式

时间:2019-02-20 19:34:52

标签: java regex

我写了一个Java程序来在字符串中找到模式“ Type”:“ Value”。这是我写的模式->“ Type [\ W] * Value”。在运行时将“值”替换为实际值 它适用于“ Type”:“ Name”或“ Type”:“ Name <”之类的字符串,但是当我通过括号时,它将失败。

“ Type”:“ Name(”-java.util.regex.PatternSyntaxException:inex附近的未封闭组。

“类型”:“名称()”-找不到匹配项。

我没有太多写正则表达式的经验。有人可以帮我理解这个问题。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;

public class PatternFinder {
    public static void main(String args[]) {
        System.out.println(findPattern("Name","abcd7<","{\"response\":{\"Name\":\"abcd7<\"}}"));
        System.out.println(findPattern("Name","abcd7(","{\"response\":{\"Name\":\"abcd7(\"}}"));
    }
    private static int findPattern(String InputType, String InputValue, String responseString) {
        System.out.println("extractEncode" + responseString);
        int indexOfInputPattern = -1;
        String InputStringPattern = "InputType[\\W]*InputValue";
        InputStringPattern = StringUtils.replaceEach(InputStringPattern, new String[] { "InputType", "InputValue" },
                new String[] { InputType, InputValue });
        System.out.println(InputStringPattern);
        if (!StringUtils.isBlank(InputStringPattern)) {
            Pattern pattern = Pattern.compile(InputStringPattern);
             indexOfInputPattern = indexOf(pattern, responseString); 
        }
        return indexOfInputPattern;
    }

    private static int indexOf(Pattern pattern, String s) {
        System.out.println(pattern.toString()+" "+s);
        Matcher matcher = pattern.matcher(s);
        return matcher.find() ? matcher.end() : -1;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以通过在括号前面添加反斜杠来转义括号,也可以使用Pattern.quote来转义不想被解释为Pattern的部分。

在这里https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#quote(java.lang.String)

了解更多

答案 1 :(得分:1)

如果要在正则表达式中搜索括号(),则必须使用反斜杠\对其进行转义。因此,您搜索Name\(。这是因为括号在正则表达式中具有特殊含义。

为了使事情更复杂,\是Java String中的一个特殊字符,因此您可能会发现也必须对此进行转义。因此,您的最终表达式可能看起来像Name\\(