Функция Escape цитаты в Java не работает - PullRequest
0 голосов
/ 11 ноября 2010

Мне нужно экранировать кавычки из строки перед их распечаткой.

Я написал функцию, использующую массивы символов, чтобы быть как можно более явными.Но, похоже, все, что делает эта функция, это распечатывает свой собственный ввод:

public static String escapeQuotes(String myString) {
 char[] quote=new char[]{'"'};
 char[] escapedQuote=new char[]{'\\' , '"'};
 return myString.replaceAll(new String(quote), new String(escapedQuote));
}

public static void main(String[] args) throws Exception {
 System.out.println("asd\"");
 System.out.println(escapeQuotes("asd\""));
}

Я бы ожидал, что результат этого будет: asd "asd \"

Однако я получаю:asd "asd"

Есть идеи, как сделать это правильно?

Спасибо

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Я бы попробовал replace вместо replaceAll.Вторая версия предназначена для регулярных выражений, AFAIK.

edit
From replaceAll docs
Обратите внимание, что при замене используются обратные слеши (\) и знаки доллара ($)Строка может привести к тому, что результаты будут другими, чем если бы она обрабатывалась как буквенная замещающая строка
Итак, обратная косая черта во втором аргументе является проблемой.

Прямая ссылка на документы
http://download.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String)

1 голос
/ 11 ноября 2010

Java поставляется с легкодоступными методами для избежания регулярных выражений и замен:

public static String escapeQuotes(String myString) { 
  return myString.replaceAll(Pattern.quote("\""), Matcher.quoteReplacement("\\\"")); 
}
1 голос
/ 11 ноября 2010

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

Каждому \ или " символу, который вы вводите в строку литерала Java, должен предшествовать \.

Вы хотите использовать replace, а не replaceAll, поскольку первый имеет дело со строками, а второй - с регулярными выражениями.В вашем случае регулярное выражение будет медленнее и потребует еще больше обратной косой черты.

replace, которая работает с CharSequence с, то есть String с в этом случае существует начиная с Java 1.5 и далее.

myString = myString.replace("\\", "\\\\");
myString = myString.replace("\"", "\\\"");
...