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