Java - wyrażenia regularne
Java udostępnia pakiet java.util.regex do dopasowywania wzorców za pomocą wyrażeń regularnych. Wyrażenia regularne Java są bardzo podobne do języka programowania Perl i bardzo łatwe do nauczenia.
Wyrażenie regularne to specjalna sekwencja znaków, która pomaga dopasować lub znaleźć inne ciągi lub zestawy ciągów przy użyciu specjalistycznej składni przechowywanej we wzorcu. Można ich używać do wyszukiwania, edycji lub manipulowania tekstem i danymi.
Pakiet java.util.regex składa się głównie z następujących trzech klas -
Pattern Class- Obiekt Pattern jest skompilowaną reprezentacją wyrażenia regularnego. Klasa Pattern nie udostępnia żadnych publicznych konstruktorów. Aby utworzyć wzorzec, musisz najpierw wywołać jeden z jego publicznych statycznychcompile()metody, które następnie zwrócą obiekt Pattern. Te metody akceptują wyrażenie regularne jako pierwszy argument.
Matcher Class- Obiekt Matcher to silnik, który interpretuje wzorzec i wykonuje operacje dopasowywania względem ciągu wejściowego. Podobnie jak klasa Pattern, Matcher nie definiuje żadnych publicznych konstruktorów. Otrzymujesz obiekt Matcher, wywołującmatcher() na obiekcie Pattern.
PatternSyntaxException - Obiekt PatternSyntaxException jest niezaznaczonym wyjątkiem, który wskazuje błąd składni we wzorcu wyrażenia regularnego.
Przechwytywanie grup
Przechwytywanie grup to sposób na traktowanie wielu postaci jako jednej jednostki. Tworzy się je poprzez umieszczenie znaków, które mają być zgrupowane, w nawiasach. Na przykład wyrażenie regularne (pies) tworzy pojedynczą grupę zawierającą litery „d”, „o” i „g”.
Grupy przechwytywania są numerowane, licząc ich nawiasy otwierające od lewej do prawej. Na przykład w wyrażeniu ((A) (B (C))) są cztery takie grupy -
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
Aby dowiedzieć się, ile grup jest obecnych w wyrażeniu, wywołaj metodę groupCount na obiekcie dopasowującym. Metoda groupCount zwraca plikint pokazująca liczbę grup przechwytujących obecnych we wzorcu dopasowania.
Istnieje również grupa specjalna, grupa 0, która zawsze reprezentuje całe wyrażenie. Ta grupa nie jest uwzględniona w łącznej kwocie zgłaszanej przez groupCount.
Example
Poniższy przykład ilustruje, jak znaleźć ciąg cyfr z podanego ciągu alfanumerycznego -
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
}else {
System.out.println("NO MATCH");
}
}
}
To da następujący wynik -
Output
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Składnia wyrażeń regularnych
Oto tabela zawierająca listę wszystkich składni metaznaków wyrażeń regularnych dostępnych w języku Java -
Podwyrażenie | mecze |
---|---|
^ | Dopasowuje początek wiersza. |
$ | Dopasowuje do końca wiersza. |
. | Dopasowuje dowolny pojedynczy znak z wyjątkiem nowej linii. Za pomocąm Opcja pozwala również dopasować nową linię. |
[…] | Dopasowuje dowolny pojedynczy znak w nawiasach. |
[^ ...] | Dopasowuje dowolny pojedynczy znak nie w nawiasach. |
\ZA | Początek całego ciągu. |
\ z | Koniec całego ciągu. |
\ Z | Koniec całego ciągu z wyjątkiem dopuszczalnego końcowego terminatora wiersza. |
re* | Dopasowuje 0 lub więcej wystąpień poprzedniego wyrażenia. |
re + | Dopasowuje 1 lub więcej poprzedniej rzeczy. |
re? | Dopasowuje 0 lub 1 wystąpienie poprzedniego wyrażenia. |
re {n} | Dopasowuje dokładnie n liczbę wystąpień poprzedniego wyrażenia. |
re {n,} | Dopasowuje n lub więcej wystąpień poprzedniego wyrażenia. |
re {n, m} | Pasuje do co najmniej n i co najwyżej m wystąpień poprzedniego wyrażenia. |
a | b | Pasuje do a lub b. |
(re) | Grupuje wyrażenia regularne i zapamiętuje dopasowany tekst. |
(?: re) | Grupuje wyrażenia regularne bez zapamiętywania dopasowanego tekstu. |
(?> re) | Dopasowuje niezależny wzorzec bez cofania. |
\ w | Dopasowuje znaki słowa. |
\ W | Dopasowuje znaki inne niż słowa. |
\ s | Odpowiada spacji. Odpowiednik [\ t \ n \ r \ f]. |
\ S | Dopasowuje niebiałą spację. |
\re | Dopasowuje cyfry. Odpowiednik [0-9]. |
\RE | Pasuje do niecyfry. |
\ZA | Dopasowuje początek ciągu. |
\ Z | Dopasowuje koniec ciągu. Jeśli istnieje nowa linia, pasuje ona tuż przed nową linią. |
\ z | Dopasowuje koniec ciągu. |
\SOL | Odpowiada punktowi, w którym zakończył się ostatni mecz. |
\ n | Odwołanie wsteczne do numeru grupy przechwytywania „n”. |
\b | Dopasowuje granice wyrazów poza nawiasami. Dopasowuje znak Backspace (0x08) wewnątrz nawiasów. |
\B | Dopasowuje granice bez słów. |
\ n, \ t itd. | Dopasowuje znaki nowej linii, powroty karetki, tabulatory itp. |
\ Q | Ucieczka (cudzysłów) wszystkimi znakami do \ E. |
\MI | Kończy cytowanie zaczynające się od \ Q. |
Metody klasy dopasowującej
Oto lista przydatnych metod instancji -
Metody indeksowania
Metody indeksujące zapewniają przydatne wartości indeksu, które dokładnie pokazują, gdzie znaleziono dopasowanie w ciągu wejściowym -
Sr.No. | Metoda i opis |
---|---|
1 | public int start() Zwraca indeks początkowy poprzedniego dopasowania. |
2 | public int start(int group) Zwraca indeks początkowy podciągu przechwyconego przez daną grupę podczas poprzedniej operacji dopasowania. |
3 | public int end() Zwraca przesunięcie po ostatnim dopasowanym znaku. |
4 | public int end(int group) Zwraca przesunięcie po ostatnim znaku podciągu przechwyconym przez daną grupę podczas poprzedniej operacji dopasowania. |
Metody badań
Metody badania przeglądają ciąg wejściowy i zwracają wartość logiczną wskazującą, czy wzorzec został znaleziony, czy nie -
Sr.No. | Metoda i opis |
---|---|
1 | public boolean lookingAt() Próbuje dopasować sekwencję wejściową, zaczynając od początku regionu, względem wzorca. |
2 | public boolean find() Próbuje znaleźć następny podciąg sekwencji wejściowej, który pasuje do wzorca. |
3 | public boolean find(int start) Resetuje ten element dopasowujący, a następnie próbuje znaleźć następny podciąg sekwencji wejściowej pasującej do wzorca, zaczynając od określonego indeksu. |
4 | public boolean matches() Próbuje dopasować cały region do wzorca. |
Metody wymiany
Metody zamiany to przydatne metody zastępowania tekstu w ciągu wejściowym -
Sr.No. | Metoda i opis |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) Implementuje nieterminalowy krok dołączania i zamieniania. |
2 | public StringBuffer appendTail(StringBuffer sb) Implementuje krok dołączania i zastępowania terminala. |
3 | public String replaceAll(String replacement) Zastępuje każdy podciąg sekwencji wejściowej, który pasuje do wzorca podanym ciągiem zastępującym. |
4 | public String replaceFirst(String replacement) Zastępuje pierwszy podciąg sekwencji wejściowej, która pasuje do wzorca podanym ciągiem zastępującym. |
5 | public static String quoteReplacement(String s) Zwraca ciąg znaków zastępujący literał dla określonego ciągu. Ta metoda tworzy ciąg, który będzie działał jako dosłowny zamienniks w metodzie appendReplacement klasy Matcher. |
Metody rozpoczęcia i zakończenia
Poniżej znajduje się przykład zliczający, ile razy słowo „kot” pojawia się w ciągu wejściowym -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "\\bcat\\b";
private static final String INPUT = "cat cat cat cattie cat";
public static void main( String args[] ) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
To da następujący wynik -
Output
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
Jak widać, w tym przykładzie zastosowano granice słów, aby zapewnić, że litery „c”, „a” „t” nie są jedynie podłańcuchem w dłuższym słowie. Zawiera również przydatne informacje o tym, gdzie w ciągu wejściowym wystąpiło dopasowanie.
Metoda start zwraca indeks początkowy podciągu przechwyconego przez daną grupę podczas poprzedniej operacji dopasowania, a end zwraca indeks ostatniego dopasowanego znaku plus jeden.
Dopasowania i metody LookingAt
Metody match i lookingAt próbują dopasować sekwencję wejściową do wzorca. Różnica polega jednak na tym, że dopasowanie wymaga dopasowania całej sekwencji wejściowej, podczas gdy lookAt nie.
Obie metody zawsze rozpoczynają się na początku ciągu wejściowego. Oto przykład wyjaśniający funkcjonalność -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
private static Pattern pattern;
private static Matcher matcher;
public static void main( String args[] ) {
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("Current REGEX is: "+REGEX);
System.out.println("Current INPUT is: "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
To da następujący wynik -
Output
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
Metody replaceFirst i replaceAll
Metody replaceFirst i replaceAll zastępują tekst pasujący do danego wyrażenia regularnego. Jak wskazują ich nazwy, replaceFirst zastępuje pierwsze wystąpienie, a replaceAll zastępuje wszystkie wystąpienia.
Oto przykład wyjaśniający funkcjonalność -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "dog";
private static String INPUT = "The dog says meow. " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
To da następujący wynik -
Output
The cat says meow. All cats say meow.
Metody appendReplacement i appendTail
Klasa Matcher udostępnia również metody appendReplacement i appendTail do zastępowania tekstu.
Oto przykład wyjaśniający funkcjonalność -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
To da następujący wynik -
Output
-foo-foo-foo-
Metody klasy PatternSyntaxException
Wyjątek PatternSyntaxException to niezaznaczony wyjątek, który wskazuje błąd składni we wzorcu wyrażenia regularnego. Klasa PatternSyntaxException udostępnia następujące metody ułatwiające określenie, co poszło nie tak -
Sr.No. | Metoda i opis |
---|---|
1 | public String getDescription() Pobiera opis błędu. |
2 | public int getIndex() Pobiera indeks błędu. |
3 | public String getPattern() Pobiera błędny wzorzec wyrażenia regularnego. |
4 | public String getMessage() Zwraca wielowierszowy ciąg zawierający opis błędu składniowego i jego indeksu, błędny wzorzec wyrażenia regularnego oraz wizualne wskazanie indeksu błędu we wzorcu. |