Как избежать текста регулярного выражения в Java для расширенного формата POSIX - PullRequest
3 голосов
/ 26 февраля 2011

Я хочу процитировать часть строки, которая будет обрабатываться как буквальная строка внутри большего выражения регулярного выражения, и это выражение должно соответствовать формату POSIX Extended Regular Expressions .

Этот вопрос очень похож на этот существующий вопрос , за исключением того, что ответ там не удовлетворяет меня, поскольку он предлагает использовать Pattern.quote(), который опирается на специальные отметки \Q и \E - они поддерживаются регулярными выражениями Java, но не соответствуют формату POSIX Extended.

Например, я хочу, чтобы one.two стал one\.two, а не \Qone.two\E.

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Может быть, что-то вроде этого:

// untested
String escape(String inString)
{
    StringBuilder builder = new StringBuilder(inString.length() * 2);
    String toBeEscaped = "\\{}()[]*+?.|^$";

    for (int i = 0; i < inString.length(); i++)
    {
        char c = inString.charAt(i);

        if (toBeEscaped.contains(c))
        {
            builder.append('\\');
        }

        builder.append(c);
    }

    return builder.toString();
}
2 голосов
/ 01 марта 2011

Ответ Брайана может быть упрощен до

String toBeEscaped = "\\{}()[]*+?.|^$";
return inString.replaceAll("[\\Q" + toBeEscaped + "\\E]", "\\\\$0");

Протестировано только с "one.two".

...