2012-07-28 9 views
7

Więc jestem zupełnie nowe do wyrażeń regularnych, i staram się używać java.util.regex Java, aby znaleźć się w ciągach znaków interpunkcyjnych. Nie wiem, jaki rodzaj interpunkcji mogę uzyskać przed czasem, z wyjątkiem tego, że (1)!,?,., ... są wszystkie prawidłowe przebicia i (2) "<" i ">" oznaczają coś specjalnego, i nie liczą się jako interpunkcja. Sam program tworzy frazę pseudolosowo i chcę usunąć interpunkcję na końcu zdania, zanim przejdzie proces losowy.Wyrażenia regularne na interpunkcji

mogę dopasować całe słowa z dowolnego interpunkcji, ale dopasowujący po prostu daje mi indeksów dla tego słowa. Innymi słowy:

Pattern p = Pattern.compile("(.*\\!)*?"); 
Matcher m = p.matcher([some input string]); 

będzie przechwytywać dowolne słowa z "!" na końcu. Na przykład: - "! Day"

String inputString = "It is a warm Summer day!"; 
Pattern p = Pattern.compile("(.*\\!)*?"); 
Matcher m = p.matcher(inputString); 
String match = inputString.substring(m.start(), m.end()); 

wyników w meczu> String ~

Ale chcę mieć indeks Matcher tylko „!”, Więc mogę tylko podzielić ją wyłączyć.

Prawdopodobnie mógłbym tworzyć przypadki i używać String String (...) dla każdego rodzaju interpunkcji, które mógłbym dostać, ale mam nadzieję, że jest jakiś błąd w używaniu wyrażeń regularnych, aby to zrobić.

+0

Oh! O Boże, nawet tego nie zauważyłem. Nie, wcale nie było to celowe - dziękuję za to! –

Odpowiedz

6

chciałbym spróbować klasę postaci regex podobną do

"[.!?\\-]" 

Dodaj cokolwiek znaków chcesz dopasować wewnątrz [] s. Unikaj znaków, które mogą mieć specjalne znaczenie dla parsera regex.

Następnie trzeba wykonać iterację meczów za pomocą Matcher.find() dopóki nie zwróci false.

+1

Podpowiedź: [tutaj] (http://www.regular-expressions.info/charclass.html) możesz przeczytać, że * znaki specjalne lub metaznaki wewnątrz klasy znaków są nawiasem zamykającym (]), ukośnikiem odwrotnym (\), karetka (^) i łącznik (-) *. Zwykłe metaznaki są normalnymi znakami wewnątrz klasy znaków. Więc '" [\\. \\! \\?] "' Jest takie samo jak '" [.!?] "' – Pshemo

+0

@Pshemo Dzięki, nie byłem do końca pewien. Oczywiście, nie boli ucieczki z tych postaci, prawda? –

+0

Mam nadzieję, że nie, bo kiedyś też znaki ewakuacyjne w moich wcześniejszych projektów :) – Pshemo

18

Java obsługuje klasy znaków POSIX w rondzie. W przypadku interpunkcji odpowiednik Javy [: punct:] to \ p {Punct}.

Aby uzyskać szczegółowe informacje, zapoznaj się z następującym link.

Oto konkretny, przykład pracy, który wykorzystuje swój wyraz w komentarzach

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexFindPunctuation { 

    public static void main(String[] args) { 
     Pattern p = Pattern.compile("\\p{Punct}"); 

     Matcher m = p.matcher("One day! when I was walking. I found your pants? just kidding..."); 
     int count = 0; 
     while (m.find()) { 
      count++; 
      System.out.println("\nMatch number: " + count); 
      System.out.println("start() : " + m.start()); 
      System.out.println("end() : " + m.end()); 
      System.out.println("group() : " + m.group()); 
     } 
    } 
} 
+3

Znacznie lepiej używać '\ pP'. – tchrist

+0

Próbowałem uruchomić Pattern.compile (" \\ p {Punct} ") (po dwukrotnej ucieczce wspomnianej w tym dowiązaniu), ale nie znaleziono żadnej interpunkcji, albo . W szczególności uruchomiłem następujący kod: String input = "One day! kiedy szedłem. Znalazłem twoje spodnie? żartuję ... "; Wzór p = Pattern.compile (" \\ p {Punct} "); Matcher m = p.matcher (input); –

+2

Ten sam problem jak powyżej, użyj' Matcher.find() ' Zauważ, że jest to znacznie lepsze pod względem wydajności (pamięci) niż zwracanie wszystkich dopasowań.Jeśli chcesz po prostu dopasować cały ciąg, możesz równie dobrze napisać '" input ".match (" pattern ")' przy okazji. –

Powiązane problemy