2014-07-14 4 views
1

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

Например: С может только предшествуют А или В, то есть, если С находится следующий символ может быть только А или В. Р может только предшествовать D или Е (Р не может предшествовать А или В)

или B, тогда может произойти C D или E, тогда может произойти F

Как это сделать?

Следующая дает мне ошибку:

String pattern = "([F][D|E])|([A][B|C])"; 
String test = "FEAC"; 
System.out.println(test.matches(pattern)); 

ответ

2

Предполагая, что только допустимые буквы от А до F, вы можете использовать это:

^(?:C[AB]|F[DE]|[ABDEG-Z])+$ 

Смотрите матчи в the demo

Пояснение

  • Якоря не нужно будет с помощью метода matches, но объяснить их для сырой версии:
  • ^ якорь утверждает, что мы находимся в самом начале строки
  • $ якорной утверждает, что мы находимся конец строки
  • матча C[AB] с тогда А или в, иЛИ |
  • F[DE] двойку затем D или Е, иЛИ |
  • [ABDEG-Z] один из этих писем
  • + один или несколько раз

Опция: Разрешение C и F в конце строки

Если вы хотите, чтобы C или F в конце строка, добавьте это: |[CF]$ (один из нескольких способов сделать это)

регулярное выражение становится:

^(?:C[AB]|F[DE]|[ABDEG-Z]|[CF]$)+$ 

В Java:

if (subjectString.matches("(?:C[AB]|F[DE]|[ABDEG-Z])+")) { 
    // It matched! 
    } 
else { // nah, it didn't match... 
    } 
+0

FYI добавлен второй вариант в случае, если вы хотите разрешить F или C в конце строки (не следующие буквы) – zx81

+0

мы можем сделать его общим для всех других алфавитов, а? – Braj

+0

есть, это работает. следуя по Браджу, как я могу разрешить другим персонажам существовать? Например, CBYIU должен дать истину – stretchr

Смежные вопросы