изменение программы регулярных выражений, исключая пробелы - PullRequest
1 голос
/ 20 января 2011

У меня есть оператор, который находит строки, содержащие один символ, например P. Это работает при сопоставлении со строкой, разделенной пробелами

например,

APAXA

Thr регулярное выражение ^[^P]*P[^P]*$

Это прекрасно выбирает эту строку, однако, что если у меня есть строка

XPA  DREP EDS

Каким будет регулярное выражение для идентификации всех строк в одной строке, соответствующих условию (строкивсегда отделены каким-то пробелом - табуляцией, пробелом и т. д.)

например, как бы я выделил XPA и DREP

Я использую while(m.find()) для многократного цикла и System.out.println (m.group ())

, поэтому m.group должна содержать всю строку.

Ответы [ 6 ]

2 голосов
/ 20 января 2011

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

1 голос
/ 20 января 2011

почему это должно быть слишком сложное регулярное выражение?

String string = "XPA  DREP EDS";
String[] s = string.split("\\s+");
for( String str: s){
  if ( str.contains("P") ){
     System.out.println( str );
  }
}
0 голосов
/ 20 января 2011

Попробуйте добавить пробельные символы (\s) в классы отрицанных символов, и вы также захотите удалить якоря ^ и $:

[^P\s]*P[^P\s]*

или как строку Javaлитерал:

"[^P\\s]*P[^P\\s]*"

Обратите внимание, что вышеприведенное не работает на Unicode, только на ASCII (как упомянул tchrist в комментариях).

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

Thr reex, являющийся ^ [^ P] P [^ P] $

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

Для поиска всех слов, содержащих хотя бы один P, вы можете использовать \\S+P\\S+, где \S обозначает непустой символ.Вместо этого вы можете рассмотреть \w.

Чтобы найти все слова, содержащие ровно один P, вы можете использовать [^\\sP]+P[^\\sP]+(?=\\s), что более сложно.Здесь \s обозначает пустое значение, [^abc] соответствует всему ожидаемому для abc, (?=...) - это предвидение.Без предварительного просмотра в «APBPC» вы найдете два «слова»: «APB» и «PC».

0 голосов
/ 20 января 2011
\b[^P\s]*P[^P\s]*\b

будет соответствовать всем словам, которые содержат ровно один P. Не забудьте удвоить обратную косую черту при построении вашего регулярного выражения из строки Java.

Объяснение:

\b      # Assert position at start/end of a word
[^P\s]* # Match any number of characters except P and whitespace
P       # Match a P
[^P\s]* # Match any number of characters except P and whitespace
\b      # Assert position at start/end of a word

Обратите внимание, что \b не соответствует всем границам слов при работе со строкой Unicode (спасибо tchrist за напоминание).Если это так, вы можете заменить \b s на (не смотрите):

(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))

(взято из победного ответа на этот вопрос)

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

вы можете попробовать использовать шаблон \s (соответствует пробелу). Посмотрите на эту страницу regexp для Java.

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