Regelmatige uitdrukkingen op interpunctie

Dus ik ben helemaal nieuw in reguliere uitdrukkingen, en ik probeer Java’s java.util.regexte gebruiken om interpunctie in invoerreeksen te vinden. Ik weet niet wat voor soort interpunctie ik van tevoren zou kunnen krijgen, behalve dat (1) !, ?, ., … allemaal geldige interpunctie zijn, en (2) “<” en “>” iets speciaals betekenen en tellen niet als interpunctie.
Het programma zelf bouwt zinnen pseudo-willekeurig en ik wil de interpunctie aan het einde van een zin verwijderen voordat het door het willekeurige proces gaat.

Ik kan hele woorden matchen met elke interpunctie, maar de matcher geeft me alleen indexen voor dat woord. Met andere woorden:

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

pakt alle woorden met een "!"aan het einde. Bijvoorbeeld:

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());

resulteert in –> Tekenreeksovereenkomst ~ “dag!”

Maar ik wil de Matcher-index alleen de "!"hebben, zodat ik het gewoon kan afsplitsen.

Ik zou waarschijnlijk gevallen kunnen maken en String.substring(...)kunnen gebruiken voor elk soort interpunctieteken dat ik zou kunnen krijgen, maar ik hoop dat er een fout zit in mijn gebruik van reguliere expressies om doe dit.


Antwoord 1, autoriteit 100%

Ik zou een karakterklasse-regex proberen die lijkt op

"[.!?\\-]"

Voeg de tekens toe die je wilt matchen in de []s. Wees voorzichtig om tekens die een speciale betekenis kunnen hebben voor de regex-parser te escapen.

Vervolgens moet je de overeenkomsten herhalen door Matcher.find()te gebruiken totdat het false retourneert.


Antwoord 2, autoriteit 99%

Java ondersteunt POSIX-tekenklassen op een omweg. Voor interpunctie is het Java-equivalent van [:punct:]\p{Punct}.

Zie de volgende linkvoor details.

Hier is een concreet, werkend voorbeeld dat de uitdrukking in de opmerkingen gebruikt

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());
        }
    }
}

Antwoord 3, autoriteit 4%

Ik zou het proberen

\W

het komt overeen met elk niet-woordteken. Dit omvat spaties en leestekens, maar geen underscores. Het is gelijk aan [^A-Za-z0-9_]

Other episodes