java 正则表达
正則表達(dá)式(英語(yǔ):Regular?Expression)原屬于計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。在很多文本編輯器里邊,正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式的文本。許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,Perl,Shell,R,Java等等。
| 元字符 | 描述 |
| \ | 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè)向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,“\\n”匹配\n。“\n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當(dāng)于多種編程語(yǔ)言中都有的“轉(zhuǎn)義字符”的概念。 |
| ^ | 匹配輸入字符串的開始位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。 |
| $ | 匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。 |
| * | 匹配前面的子表達(dá)式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”。*等價(jià)于{0,}。 |
| + | 匹配前面的子表達(dá)式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}。 |
| ? | 匹配前面的子表達(dá)式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價(jià)于{0,1}。 |
| {n} | n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個(gè)o。 |
| {n,} | n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價(jià)于“o+”。“o{0,}”則等價(jià)于“o*”。 |
| {n,m} | m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個(gè)o。“o{0,1}”等價(jià)于“o?”。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。 |
| ? | 當(dāng)該字符緊跟在任何一個(gè)其他限制符(*,+,?,{n},{n,},{n,m})后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串“oooo”,“o+?”將匹配單個(gè)“o”,而“o+”將匹配所有“o”。 |
元字符是一個(gè)預(yù)定義的字符。
| \d | 匹配一個(gè)數(shù)字,是?[0-9]?的簡(jiǎn)寫 |
| \D | 匹配一個(gè)非數(shù)字,是?[^0-9]?的簡(jiǎn)寫 |
| \s | 匹配一個(gè)空格,是?[ \t\n\x0b\r\f]?的簡(jiǎn)寫 |
| \S | 匹配一個(gè)非空格 |
| \w | 匹配一個(gè)單詞字符(大小寫字母、數(shù)字、下劃線),是?[a-zA-Z_0-9]?的簡(jiǎn)寫 |
| \W | 匹配一個(gè)非單詞字符(除了大小寫字母、數(shù)字、下劃線之外的字符),等同于?[^\w] |
限定符定義了一個(gè)元素可以發(fā)生的頻率。
| * | 匹配 >=0 個(gè),是?{0,}?的簡(jiǎn)寫 | X*?表示匹配零個(gè)或多個(gè)字母 X,.*表示匹配任何字符串 |
| + | 匹配 >=1 個(gè),是?{1,}?的簡(jiǎn)寫 | X+?表示匹配一個(gè)或多個(gè)字母 X |
| ? | 匹配 1 個(gè)或 0 個(gè),是?{0,1}?的簡(jiǎn)寫 | X??表示匹配 0 個(gè)或 1 個(gè)字母 X |
| {X} | 只匹配 X 個(gè)字符 | \d{3}?表示匹配 3 個(gè)數(shù)字,.{10}表示匹配任何長(zhǎng)度是 10 的字符串 |
| {X,Y} | 匹配 >=X 且 <=Y 個(gè) | \d{1,4}?表示匹配至少 1 個(gè)最多 4 個(gè)數(shù)字 |
| *? | 如果???是限定符?*?或?+?或???或?{}?后面的第一個(gè)字符,那么表示非貪婪模式(盡可能少的匹配字符),而不是默認(rèn)的貪婪模式 |
Java中的反斜杠:反斜杠?\?在 Java 中表示轉(zhuǎn)義字符,這意味著?\?在 Java 擁有預(yù)定義的含義。
這里例舉兩個(gè)特別重要的用法:
- 在匹配?.?或?{?或?[?或?(?或???或?$?或?^?或?*?這些特殊字符時(shí),需要在前面加上?\\,比如匹配?.?時(shí),Java 中要寫為?\\.,但對(duì)于正則表達(dá)式來(lái)說(shuō)就是?\.。
- 在匹配?\?時(shí),Java 中要寫為?\\\\,但對(duì)于正則表達(dá)式來(lái)說(shuō)就是?\\。
注意:Java 中的正則表達(dá)式字符串有兩層含義,首先 Java 字符串轉(zhuǎn)義出符合正則表達(dá)式語(yǔ)法的字符串,然后再由轉(zhuǎn)義后的正則表達(dá)式進(jìn)行模式匹配。
表達(dá)式:[ ]與()
- [jpg|png]?代表匹配?j?或?p?或?g?或?p?或?n?或?g?中的任意一個(gè)字符。
- (jpg|png)?代表匹配?jpg?或?png。
正則中的前瞻,后顧,負(fù)前瞻,負(fù)后顧四個(gè)概念
前瞻: exp1(?=exp2) 查找exp2前面的exp1
后顧: (?<=exp2)exp1 查找exp2后面的exp1
負(fù)前瞻: exp1(?!exp2) 查找后面不是exp2的exp1
負(fù)后顧: (?<!=exp2)exp1 查找前面不是exp2的exp1
如:b.regexp("(?<!\\\\)[\\s]*+")表示匹配前面不是\\的n(n>=0)個(gè)空格
[\\s]* 表示>=0 個(gè)空格
如:b.regexp("([^=:\\s]|(?<=\\\\)\\ |(?<=\\\\)\\=|(?<=\\\\)\\:)+")
(?<=\\\\)表示 \
表示匹配字符串以=:空格其中一個(gè)開始 或 \\?或 \\= 或 \\: 多個(gè)
例如:b.regexp("^\\[.*?\\]$") 匹配前后[ ]
例如:b.regexp("^\\s*+\\-\\s") 匹配“? ?- xxxxx ”
中文匹配:
[\u4e00-\u9fa5]+?代表匹配中文字。
可以在正則的開頭指定模式修飾符:
- (?i)?使正則忽略大小寫。
- (?s)?表示單行模式("single line mode")使正則的?.?匹配所有字符,包括換行符。
- (?m)?表示多行模式("multi-line mode"),使正則的?^?和?$?匹配字符串中每行的開始和結(jié)束。
總結(jié)
- 上一篇: 编写sonar插件 The follow
- 下一篇: 少年是指哪个年龄段