2012-07-04 8 views
5

Mam dość osobliwy problem. Próbuję znaleźć wzór taki jak [some string][word boundary]. Uproszczone, mój kod jest: b nie pasuje, gdy poprzedni znak jest granicą słowa

final Pattern pattern = Pattern.compile(Pattern.quote(someString) + "\\b"); 
final String value = someString + " "; 
System.out.println(pattern.matcher(value).find()); 

Moja logika mówi mi, to powinien zawsze wysyłany true, niezależnie od tego, co someString jest. Jednakże:

  • jeśli someString kończy znak słowa (na przykład „abc”) jest przesyłany true;
  • jeśli someString kończy się granicą słowa (np. "Abc."), Wyprowadzany jest false.

Jakieś pomysły, co się dzieje? Moje bieżące obejście polega na użyciu \W zamiast \b, ale nie jestem pewien co do implikacji.

Odpowiedz

6

Kropka, a następnie spacja nie jest granicą wyrazów.

Granica słowa jest między znakiem słownym, a następnie nie-słowem lub odwrotnie.
czyli między [a-zA-Z0-9_][^a-zA-Z0-9_] lub [^a-zA-Z0-9_][a-zA-Z0-9_]

4

Granica słowa jest niesłowa, która poprzedzona jest znakiem słownym lub na odwrót. Przestrzeń poprzedzona kropką (2 znaki bez słów) nie spełnia tego wymogu.

Wpływ stosowania \W jest to, że wszelkie znaki nie-słowo zostanie dopasowany (tak samo jak \b, ale bez warunku, że znak jest poprzedzony znakiem słowa), co wydaje poprawne dla przykładu.

+0

Tak, ale okres w 'abc.' powinny stać się częścią regex (przez' Pattern.quote ("abc"). '. Zatem wzór powinien stać się„'abc.' następnie granica słowa ", która powinna pasować do' abc., po której następuje spacja. " – Felix

+1

@Fixel dla znaku, który ma być granicą wyrazu, musi być znakiem bez słownym, poprzedzonym znakiem słownym. Okres nie spełnia tego wymogu –

+0

Dzięki! Miałem wrażenie, że był to skrót do klasy postaci, np. '\ W'. – Felix

Powiązane problemy