java.util.regex.Matcher.replaceВсе замены без совпадения? - PullRequest
2 голосов
/ 02 января 2011

По словам Javadoc:

Заменяет каждую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

Похоже, это означает, что этот вызов не будет заменен, если не будет найдено совпадение.

И еще:

public class MisMatch {
    public static void main(String args[]){
        Pattern doubleSlash = Pattern.compile("\\\\");
        String stringWithSingleSlash = "maybe\\no";
        System.out.println("Matches:"+doubleSlash.matcher(stringWithSingleSlash).matches());
        String replace = doubleSlash.matcher(stringWithSingleSlash).replaceAll("ABC");
        System.out.println(replace);
        System.out.println("Equal:"+(stringWithSingleSlash.equals(replace)));
    }
}

Это печатает:

Соответствует: ложь

maybeABCno

Равная ложь

  • так что это не соответствует, но все еще заменяет. Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 02 января 2011

matches on возвращает true, если вся строка соответствует - она ​​не соответствует подстроке.

Так что, если бы stringWithSingleSlash было просто "\\" вместо "mabye\\no", matches вернул бы true.

Если вас смущает тот факт, что doubleSlash соответствует одному обратному слешу, объяснение состоит в том, что "\\\\" - это строка с двумя обратными слешами, а механизм регулярных выражений интерпретирует два обратных слеша как один экранированный обратный слеш (поскольку обратный слеш являетсяescape-символ в регулярных выражениях, а также в строковых литералах).

0 голосов
/ 02 января 2011

Функция matches() пытается сопоставить шаблон со всей строкой.
Похоже, что вам следует использовать, чтобы проверить, возвращает ли .find() true.

Посмотрите на Matcher javadoc , вот выдержка:

После создания средство сопоставления может использоваться для выполнения трех различных типов операций сопоставления:

  • Метод match пытается сопоставить всю входную последовательность с шаблоном.

  • Метод LookingAt пытается сопоставить входную последовательность, начиная с начала, с шаблоном.

  • Метод find сканирует входную последовательность в поисках следующей подпоследовательности, соответствующей шаблону.

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

...