Поддержка Java для условного просмотра - PullRequest
3 голосов
/ 20 января 2012

В следующем, скажем, почтовых индексах я пытаюсь исключить 33333- из результата.
Я делаю:

String zip = "11111 22222 33333- 44444-4444";
String regex = "\\d{5}(?(?=-)-\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(zip);
while (matcher.find()) { 
   System.out.println(" Found: " + matcher.group());     
}

Ожидаем получить:

Found:  11111  
Found:  22222  
Found:  44444-4444

Я пытаюсь установить формат:
5 цифр, необязательно, за которыми следуют - и 4 цифры.5 цифр только с - (дефис) не нужны

Я получаю исключение:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 7
\d{5}(?(?=-)(-\d{4}))
       ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.group0(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)

Не правильно ли я использую условный запрос?

Ответы [ 4 ]

6 голосов
/ 20 января 2012

Для захвата всех номеров, кроме 33333, используйте этот код:

String zip = "11111 22222 33333- 44444-4444";
String regex = "\\d{5}(?=(-\\d{4}|\\s|$))(-\\d{4})?";
Matcher m = Pattern.compile(regex).matcher(zip);
while(m.find())
    System.out.printf("Macthed: [%s]%n", m.group(1));

ВЫВОД:

Macthed: [11111]
Macthed: [22222]
Macthed: [44444-4444]

Объяснение: Этот RegEx использует предпросмотр, который сам по себе похож на условие, что означает совпадение 5-значного числа, за которым должно следовать - и 4-х цифр ИЛИ пробел ИЛИ конец строки, а затем это необязательно соответствие текста - и 4 цифры.

Причина, по которой ваш исходный RegEx вызывает исключение из-за синтаксической ошибки в ?:(?=-) части вашего RegEx.

0 голосов
/ 21 января 2012
(\d{5}(?!-\s)(?:-\d{4})?)

, следовательно:

String regex = "(\\d{5}(?!-\\s)(?:-\\d{4})?)";`
0 голосов
/ 20 января 2012

Ваш вопрос немного неясен для меня. Я полагаю, вы ищете:

String st = "11111 22222 33333- 44444-4444";
String pattern = "\\d+(- )";
String res  = st.replaceAll(pattern,"");
System.out.println(res);

Выход = 11111 22222 44444-4444

0 голосов
/ 20 января 2012

Вы пропускаете двоеточие после (?, т.е. используете это регулярное выражение (не-Java-String): \d{5}(?:(?=-)-\d{4}).

Однако это может все еще не дать желаемый результат.Пожалуйста, опубликуйте пример ввода и требуемый вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...