2011-01-20 2 views
1

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

например

APAXA 

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

Он берет эту строку из тонкой, однако, что, если у меня есть строка

XPA DREP EDS 

Что бы регулярное выражение, чтобы идентифицировать все строки в одной строке, соответствовать условию (строки всегда разделены каким-то белым пространством - вкладкой, пробелом и т. д.)?

например. как бы я выделяю ХРА и DREP

Я использую while(m.find()) в цикле несколько раз и System.out.println (m.group())

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

+0

Что это за данные? Только заглавные буквы ASCII и пробелы ASCII? – tchrist

ответ

2

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

+0

Это не находит 'DREP', поскольку пробел является частью условия совпадения. –

0

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

+0

Вы имеете в виду совпадение пробелов ASCII, в отличие от пробелов Unicode. – tchrist

+0

suuuurrrree ... =) – hellatan

0
\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}]])) 

(из this question's победы ответ)

+0

это не работает при сопоставлении XPAPAPA – dr85

+0

Он здесь. Он * должен соответствовать этому слову, не так ли? –

+0

Ах, вы хотите, чтобы все слово содержало только один P? Я понял. –

0

Thr reex быть^[^ P] P [^ P] $

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

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

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

+0

Это работает только с данными ASCII. Java использует Unicode. – tchrist

+0

Вы ошибаетесь, или вы действительно имеете в виду следующее: ascii? final String s = "Příliš žluťoučký kůň úpěl ďábelské ódy"; окончательный шаблон p = Pattern.compile ("\\ S + l \\ S +"); final Matcher m = p.matcher (s); while (m.find()) System.out.println (m.group()); ' – maaartinus

0

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

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

или как Java строкового литерала:

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

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

+0

При условии, что это будет работать только с символами ASCII, а не с символами Unicode без символов ASCII. – tchrist

1

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

String string = "XPA DREP EDS"; 
String[] s = string.split("\\s+"); 
for(String str: s){ 
    if (str.contains("P")){ 
    System.out.println(str); 
    } 
} 
Смежные вопросы