2017-07-21 19 views
5

Potrzebuję regex że dany następujący ciąg:Regex wyraz uchwycić tylko słowa bez cyfr lub symboli

"test test3 t3st test: word%5 test! testing t[st" 

będzie pasował tylko słowa w AZ znaków:

powinien pasować: Testowanie Test

Nie można dopasować: test3 test t3st: test słowo% 5! t [st

Próbowałem już ([A-Za-z])\w+, ale słowo% 5 nie powinno pasować.

+1

Jakie są słowa, które oczekiwane być dopasowane? – azro

+2

Dlaczego chcesz dopasować "słowo% 5"? – chomnoue

+0

Przepraszam za brak jasności, zredagowałem pytanie. – Digao

Odpowiedz

3

Można użyć

String patt = "(?<!\\S)\\p{Alpha}+(?!\\S)"; 

Zobacz regex demo.

Dopasuje 1 lub więcej liter, które są zawarte w białych znakach lub w początkowych i końcowych miejscach ciągów znaków. Alternatywny wzór to (?<!\S)[a-zA-Z]+(?!\S) (taki sam jak powyżej) lub (?<!\S)\p{L}+(?!\S) (jeśli chcesz również dopasować wszystkie litery Unicode).

Szczegóły:

  • (?<!\\S) - negatywny lookbehind że nie mecz, jeśli nie jest non-białe znaki char zaraz na lewo od bieżącej lokalizacji
  • \\p{Alpha}+ - litery 1 lub więcej ASCII (tak samo jak [a-zA-Z]+, ale jeśli użyjesz flagi modyfikującej Pattern.UNICODE_CHARACTER_CLASS, będzie w stanie dopasować litery Unicode)
  • (?!\\S) - negatywny uprzedzający, który nie spełni warunku, jeśli po prawej stronie bieżącej lokalizacji znajduje się znak spoza białej spacji.

zobaczyć Java demo:

String s = "test test3 t3st test: word%5 test! testing t[st"; 
Pattern pattern = Pattern.compile("(?<!\\S)\\p{Alpha}+(?!\\S)"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(0)); 
} 

wyjściowa: test i testing.

+0

Dzięki Wiktor, i co ty jesteś regex dopasować przeciwieństwo tego? Mam na myśli, że reszta struny nie jest dopasowana? – Digao

+1

@ Digao: Przepraszam, jaki byłby wtedy wynik? 2 pozycje: '[" test3 test t3st: test słowo% 5 "," t [st] "]' lub 6 pozycji '[" test3 "," t3st "," test: "," słowo% 5 "," test! "," t [st "]'? –

+1

Podejrzewam, że chcesz [to] (http://ideone.com/mIvAox), aby uzyskać "przeciwne" wyniki. –

1

Spróbuj

Pattern tokenPattern = Pattern.compile("[\\p{L}]+"); 

[\\p{L}]+ ten drukuje grupę liter

Powiązane problemy