正則表達式匹配文本(或文本的一部分),或者不匹配。
*如果正則表達式匹配文本的一部分,那么我們可以找出它是哪一部分。
**如果正則表達式復雜,那么我們可以輕松地找出正則表達式的哪一部分與文本的哪一部分匹配。
第一個例子
正則表達式“ [az] + ”與文本中的所有小寫字母匹配。
[az]表示從a到z的任何字符,包括+,表示“一個或多個”。
假設我們提供了一個字符串“代碼2學習Java教程”。
在Java中如何做
首先,您必須編譯模式:
導入java.util.regex。*;
模式p = Pattern.compile(“ [az] +”);
接下來,您必須通過向模式發送消息來為文本創建匹配器 :
Matcher m = p.matcher(“代碼2學習Java教程”);
注意 :
Pattern和Matcher都沒有公共構造函數,我們通過使用Pattern類中的方法來創建它。
模式類 :模式對象是正則表達式的編譯表示。 Pattern類不提供公共構造函數。 要創建模式,必須首先調用其公共靜態編譯方法之一,然后再返回Pattern對象。 這些方法接受正則表達式作為第一個參數。
Matcher類 :Matcher對象是解釋模式并針對輸入字符串執行匹配操作的引擎。 與Pattern類一樣,Matcher沒有定義公共構造函數。 您可以通過在Pattern對象上調用matcher方法來獲得Matcher對象。
完成上述步驟后,現在有了匹配器m ,我們可以檢查是否找到了匹配項,如果匹配,則從哪個索引位置開始,等等。
如果模式與整個字符串匹配,則m.matches()返回true,否則返回false。
如果模式在字符串開頭匹配,則m.lookingAt()返回true,否則返回false 。
如果pattern與文本的任何部分匹配,則m.find()返回true 。
尋找匹配的東西
匹配成功后, m.start()將返回匹配的第一個字符的索引,而m.end()將返回匹配的最后一個字符的索引,再加上一個。
如果未嘗試匹配,或者匹配失敗,則m.start()和m.end()將拋出IllegalStateException
–這是一個RuntimeException,因此您不必捕獲它
m.end()返回匹配的最后一個字符的索引似乎很奇怪,但這正是大多數String方法所需要的
–例如,“ 現在是時間 ” .substring(m.start() , m.end() )
將返回完全匹配的子字符串。
Java程序:
import java.util.regex.*;public class RegexTest {public static void main(String args[]) {String pattern = "[a-z]+";String text = "code 2 learn java tutorial";Pattern p = Pattern.compile(pattern);Matcher m = p.matcher(text);while (m.find()) {System.out.print(text.substring(m.start(), m.end()) + "*");}}
}
輸出 :代碼*學習* java *教程*。
附加方法
如果m是一個匹配器,則
– m.replaceFirst( replacement )返回一個新的String,其中與模式匹配的第一個子字符串已被替換
– m.replaceAll(replace )返回一個新的String,其中模式匹配的每個子字符串均已替換為replace
– m.find( startIndex )從指定的索引開始查找下一個模式匹配 – m.reset()重置此匹配器 – m.reset( newText )重置此匹配器,并為其提供新文本以進行檢查(可以是String,StringBuffer或CharBuffer)
正則表達式語法
下表列出了Java中可用的所有正則表達式元字符語法:
子表達 | 火柴 |
---|---|
^ | 匹配行首。 |
$ | 匹配行尾。 |
。 | 匹配除換行符以外的任何單個字符。 使用m選項還可以使其與換行符匹配。 |
[…] | 匹配括號中的任何單個字符。 |
[^…] | 匹配任何不在方括號中的單個字符 |
\一個 | 整個字符串的開頭 |
\ z | 整個字符串的結尾 |
\ Z | 整個字符串的結尾,但允許的最后一行終止符除外。 |
回覆* | 匹配0個或多個出現的前一個表達式。 |
重新+ | 匹配1個或多個前一個 |
回覆? | 匹配0或1個出現的前一個表達式。 |
重新{n} | 精確匹配前一個表達式的n次出現。 |
re {n,} | 匹配n個或多個出現的前一個表達式。 |
re {n,m} | 至少匹配n個,最多匹配m個先前的表達式。 |
a | b | 匹配a或b。 |
(回覆) | 對正則表達式進行分組并記住匹配的文本。 |
(?: 回覆) | 對正則表達式進行分組,而無需記住匹配的文本。 |
(?>重新) | 匹配獨立模式而無需回溯。 |
\ w | 匹配單詞字符。 |
\ W | 匹配非單詞字符。 |
\ s | 匹配空格。 等效于[\ t \ n \ r \ f]。 |
\ S | 匹配非空格。 |
\ d | 匹配數字。 相當于[0-9]。 |
\ D | 匹配非數字。 |
\一個 | 匹配字符串的開頭。 |
\ Z | 匹配字符串的結尾。 如果存在換行符,則匹配換行符。 |
\ z | 匹配字符串的結尾。 |
\G | 比賽結束點。 |
\ n | 向后引用捕獲組號“ n” |
\ b | 在方括號外時匹配單詞邊界。 放在方括號內時,匹配退格鍵(0x08)。 |
\ B | 匹配非單詞邊界。 |
\ n,\ t等 | 匹配換行符,回車符,制表符等。 |
\ Q | 轉義(引號)所有字符,直到\ E |
\ E | 結束語以\ Q開頭 |
參考:來自我們JCG合作伙伴的 Java正則表達式 ? 代碼2學習博客中的Farhan Khwaja。
翻譯自: https://www.javacodegeeks.com/2012/02/regular-expressions-in-java-soft.html