Неожиданные результаты регулярных выражений - PullRequest
0 голосов
/ 26 октября 2011

Я видел несколько примеров того, как извлекать и удалять строки между разделителями.Тем не менее, я создал очень простой тестовый пример, и я получаю неправильный вывод, основанный на различных примерах.Почему я получаю строку, которую я хотел бы использовать в качестве источника поиска вместо строки, которую я ищу?

String temp = "56.0 F (13.3C)";
String exp = "((^))";
String p = temp.replace(exp, "");
System.out.println("p=" + p); 

Я получаю строку 56.0F (13.3C) в качестве выходных данных.

Я ожидаю получить 56.0F обратно.

Я также пытался использовать средство сопоставления с образцом:

Pattern pattern = Pattern.compile(exp);
Matcher matcher = pattern.matcher(temp);
if (matcher.find()) {
    System.out.println(matcher.groupCount());
    for (int i=0; i<=matcher.groupCount(); i++) {
        String groupStr = matcher.group(i);
        System.out.println(groupStr);
    }
}

2 - это то, что выводится на консоль

Любойидеи о том, что я делаю не так?Я смотрю на это сейчас пару часов.Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 октября 2011

Возвращает строку, так как не может выполнить никаких замен.

Попробуйте использовать \(.*?\) или \([^)]*\), чтобы соответствовать части строки, заключенной в круглые скобки включительно.

ЕслиВы хотите, чтобы он по желанию съел окружающий пробел, поместил \s* по обе стороны от регулярного выражения или сделал обрезку для результата.

0 голосов
/ 26 октября 2011

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

Однако вы бы получили тот же результат, если бы использовали replaceAll() или replaceFirst().^ в вашем регулярном выражении является утверждением нулевой ширины;он не потребляет каких-либо символов, он просто привязывает совпадение к началу строки.Результат, который я ожидаю увидеть из вашего второго примера:

> 56.0F (13.3C)
>
>

Другими словами, целая строка (group(0)) и две пустые строки (group(1) и group(2)).Это потому, что оба набора паренов интерпретируются как группы захвата.Если вы хотите сопоставить (буквальные) скобки и их содержимое, вы можете использовать:

String exp = "\\(.*?\\)";

... или даже лучше:

String exp = "\\([^()]*\\)";

Нет необходимости использовать группы захватана все.

...