Регулярное выражение Java, соответствующее двум последовательным согласным

Я пытаюсь сопоставить только строки с двумя последовательными согласными. но независимо от того, какой ввод я ввожу в myString, это никогда не оценивается как true, поэтому я должен предположить, что что-то не так с синтаксисом моего регулярного выражения. Любые идеи?

if (Pattern.matches("([^aeiou]&&[^AEIOU]){2}", myString)) {...}

Дополнительная информация:

  • myString — это подстрока, состоящая не более чем из двух символов.
  • Пробела нет, так как эта строка является результатом .split с разделителем пробелов.
  • Я не беспокоюсь о специальных символах, так как программа просто объединяет и печатает результат, хотя, если вы хотите показать мне, как включить что-то вроде [bz]&&[^eiou] в свой ответ, я был бы признателен.

Редактировать: пройдя эти ответы и немного протестировав код, который я наконец использовал, был

if (myString.matches("(?i)[b-z&&[^eiou]]{2}")) {...}

person BryKKan    schedule 26.02.2015    source источник
comment
У вас есть символ, который не является a, e, i, o или u, за которым следует &&, за которым следует символ, отличный от A, E, I, O или U, за которым следует то же самое снова (т.е. повторяется дважды) ?   -  person user253751    schedule 26.02.2015
comment
Если вы используете &&, вам нужно поместить пересечения в выражение в квадратных скобках. [a-z&&[^aeiou]]{2}   -  person hwnd    schedule 26.02.2015
comment
Спасибо всем! Я выбрал ответ dasblink, потому что он был старше, соответствовал моему необязательному параметру, состоящему только в том, чтобы принимать только настоящие буквы, его демонстрационная ссылка была действительно полезна для понимания использования скомпилированных шаблонов, и, наконец, я полностью понял это сразу. Еще раз, однако, все вы помогли, и если бы у меня было достаточно представителей, чтобы проголосовать, я бы, по крайней мере, сделал это для некоторых других ответов.   -  person BryKKan    schedule 26.02.2015


Ответы (2)


[^aeiou] также соответствует небуквенным символам, поэтому вам следует использовать другой шаблон:

Pattern rx = Pattern.compile("[bcdfghjklmnpqrstuvwxyz]{2}", Pattern.CASE_INSENSITIVE);
if (rx.matches(myString)) {...}

Если вы хотите использовать && для перекрестка, вы можете сделать это следующим образом:

"[a-z&&[^aeiou]]{2}"

Демонстрация

person Sergey Kalinichenko    schedule 26.02.2015
comment
@Pshemo А, вот что он пытался сделать! Это имеет смысл. Спасибо! - person Sergey Kalinichenko; 26.02.2015

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

[a-z&&[^aeiou]]{2}
person hwnd    schedule 26.02.2015
comment
Я не знаю почему, но мне не нравится идея помещать a в набор символов только для того, чтобы сразу удалить его :/ Я знаю, что это упрощает понимание регулярного выражения, но все же [b-z&&[^eiou]] кажется умнее :) - person Pshemo; 26.02.2015
comment
@Pshemo Мне нравится ход твоих мыслей =) - person hwnd; 26.02.2015