2012-02-29 1 views
0

Я задал этот вопрос несколько раз здесь Regular expression that does not contain quote but can contain escaped quote и получил ответ, но каким-то образом я не могу заставить его работать на Java.Регулярное выражение для строки с возможными escape-символами

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

В приведенном ниже коде я по существу хочу сопоставить все три строки и напечатать 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

Ваш код не соответствует вашему описанию. Обратите внимание, что элементами 'arr' являются строки, содержащие' 'tuco '', 'tuco' ABC '' и '' tuco "ABC" DEF "', то есть промежутки между цитатами: * not * экранированный – ruakh

+0

Чтобы добавить комментарий к @ ruakh, цитируемый escape в коде будет выглядеть как 'tuco \\\" ABC \\\ "" '. –

+0

Я имел в виду, что регулярное выражение должно соответствовать допустимой строке. кавычки в нем, они будут экранированы, что сделает его допустимой строкой. По сути, я хочу получить вывод true для всех трех выражений. – Tuco

ответ

0

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

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). Обратите внимание, что этот вопрос задают много. См. this answer, где я сравниваю несколько функционально эквивалентных выражений.

Смежные вопросы