Regex для String с возможными escape-символами - PullRequest
0 голосов
/ 01 марта 2012

Я задавал этот вопрос несколько раз назад Регулярное выражение, которое не содержит кавычки, но может содержать экранированную кавычку и получило ответ, но почему-то я не могу заставить его работать на Java.

В основном мне нужно написать регулярное выражение, которое соответствует правильной строке, начинающейся и заканчивающейся кавычками, и может иметь кавычки между ними при условии, что они экранированы.

В приведенном ниже коде я по сути хочусопоставить все три строки и вывести true, но не может.

Каким должно быть правильное регулярное выражение?

Спасибо

public static void main(String[] args) {

    String[] arr = new String[] 
            { 
                "\"tuco\"", 
                "\"tuco  \" ABC\"",
                "\"tuco \" ABC \" DEF\"" 
            };

    Pattern pattern = Pattern.compile("\"(?:[^\"\\\\]+|\\\\.)*\"");

    for (String str : arr) {
        Matcher matcher = pattern.matcher(str);
        System.out.println(matcher.matches());
    }

}

1 Ответ

0 голосов
/ 01 марта 2012

Проблема не столько в вашем регулярном выражении, сколько в ваших тестовых строках.Одиночная обратная косая черта перед внутренними кавычками в строках второго и третьего примера расходуется при разборе литеральной строки.Строка, передаваемая в механизм регулярных выражений, не имеет обратной косой черты перед кавычкой.(Попробуйте распечатать его.) Вот проверенная версия вашей функции, которая работает как положено:

import java.util.regex.*;
public class TEST
{
    public static void main(String[] args) {

        String[] arr = new String[] 
                { 
                    "\"tuco\"", 
                    "\"tuco  \\\" ABC\"",
                    "\"tuco \\\" ABC \\\" DEF\"" 
                };

//old:  Pattern pattern = Pattern.compile("\"(?:[^\"\\\\]+|\\\\.)*\"");
        Pattern pattern = Pattern.compile(
            "# Match double quoted substring allowing escaped chars.     \n" +
            "\"              # Match opening quote.                      \n" +
            "(               # $1: Quoted substring contents.            \n" +
            "  [^\"\\\\]*    # {normal} Zero or more non-quote, non-\\.  \n" +
            "  (?:           # Begin {(special normal*)*} construct.     \n" +
            "    \\\\.       # {special} Escaped anything.               \n" +
            "    [^\"\\\\]*  # more {normal} non-quote, non-\\.          \n" +
            "  )*            # End {(special normal*)*} construct.       \n" +
            ")               # End $1: Quoted substring contents.        \n" +
            "\"              # Match closing quote.                        ", 
            Pattern.DOTALL | Pattern.COMMENTS);

        for (String str : arr) {
            Matcher matcher = pattern.matcher(str);
            System.out.println(matcher.matches());
        }
    }
}

Я заменил ваше регулярное выражение на улучшенную версию (взято из MRE3 ),Обратите внимание, что этот вопрос часто задают.Пожалуйста, смотрите этот ответ , где я сравниваю несколько функционально эквивалентных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...