Найдите строку со специальным символом, используя регулярное выражение

Мне нужно прокрутить список и удалить все строки, содержащие какой-то специальный символ. Используя RegEx, я могу удалить все строки, начинающиеся с этих специальных символов, но как я могу узнать, находится ли этот специальный символ в середине строки?

Например:

Pattern.matches("[()<>/;\\*%$].*", "(123)") 

возвращает true, и я могу удалить эту строку

но это не работает с такой строкой: 12 (3).

Правильно ли использовать \*, чтобы найти вхождение символа "*" в строку?

Спасибо за помощь! Андреа


person Andrea Girardi    schedule 20.01.2012    source источник


Ответы (3)


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

Что вам нужно, так это соответствие одному символу среди ()<>/;\\*%$. С Java вам нужно создать Pattern, Matcher из этого Pattern и использовать .find() в этом сопоставителе:

final Pattern p = pattern.compile("[()<>/;\\*%$]");

final Matcher m = p.matcher(yourinput);

if (m.find()) // match, proceed
person fge    schedule 20.01.2012
comment
это работает :) !Pattern.compile([()‹›/;\*%$].*).matcher(res).find() - person Andrea Girardi; 20.01.2012
comment
Будьте осторожны с \* здесь: это будет соответствовать буквальной звезде. Если это то, что вы хотите, хорошо. Если вы хотите сопоставить и обратную косую черту и звездочку, вам нужно сопоставить "[()<>/;\\\\*%$]". - person fge; 20.01.2012

Попробуйте следующее:

!Pattern.matches("^[^()<>/;\\*%$]*$", "(123)")

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

Затем вы, очевидно, отрицаете выражение, поскольку проверяете строку, которая не соответствует.

Правильно ли использовать \*, чтобы найти вхождение символа "*" в строку?

Да.

person Rich O'Kelly    schedule 20.01.2012

Pattern.matches() пытается сопоставить все входные данные. Итак, поскольку ваше регулярное выражение говорит, что ввод должен начинаться со «специального» символа, 12(3) не соответствует.

person Community    schedule 20.01.2012