# RegExp
###### tags: `Java`
java doc :[https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)
test url : [https://regex-testdrive.com/en/dotest](https://regex-testdrive.com/en/dotest)
在**Java**中使用Regualr Expression完整的功能的話要使用
``java.util.regex.Pattern``
``java.util.regex.Matcher``
對特定分組嵌入旗標,可以使用 (?i:uppengarden) 這樣的語法,以下是能使用的語法:
Pattern.CASE_INSENSITIVE:(?i) 忽略大小寫
Pattern.COMMENTS:(?x) 忽略表達式內的空格、tab、換行、回到首位
Pattern.MULTILINE:(?m) 多行模式
Pattern.DOTALL:(?s) 這種模式下 . 可匹配任何字符,包含結束符
Pattern.UNICODE_CASE:(?u)
Pattern.UNICODE_CHARACTER_CLASS:(?U)
Pattern.UNIX_LINES:(?d) 判斷換行符為UNIX的
Pattern.CANON_EQ 與 Pattern.LITERAL 沒有對應的嵌入式表示法。Pattern.CANON_EQ 會啟用 Canonical equivalence,簡單來說,像 å 字元(U+00E5),也會使用 a 與 ̊ 組合標示(combining mark)(U+030A)來表示,對 Pattern 來說,預設兩個是不等價的,然而啟用了 Pattern.CANON_EQ,兩者會視為相同
**Javascript**
``/.../g`` (全局匹配)
``/.../i`` (忽略大小写比配)
``/.../m`` (多行匹配)
**字元類別**
``.``:用來匹配除了換行符號 (line breaks) `\n` `\r` 之外的任何一個字元。
``\d``: 任何數字字元,等同 [0-9]
``\D``: 任何非數字字元,等同 [\^0-9]
``\w``: 任何數字字母底線,等同 [A-Za-z0-9_]
``\W``: 任何非數字字母底線,等同 [\^A-Za-z0-9_]
``\s``: 任何空白字元(空白,換行,tab),等同 [ \f\n\r\t\v]
``\S``: 任何非空白字元(空白,換行,tab),等同 [\^ \f\n\r\t\v]
``\s\S``:匹配任意一個字元,包含換行符號。
``[..]``:匹配一個字元集合
``[^..]``:匹配一個非..字元集合
**錨點符號**
`^...`:匹配...開頭
``...$``:匹配...結尾
``\b``:匹配表示字元的「前面」或「後面」不屬於 [`\w`]的字元。
``\B``:匹配表示字元的「前面」或「後面」屬於 [`\w`]的字元。
**量詞匹配優先**
? : 表示連續出現 0 次或 1 次
\* : 表示連續出現 0 次或多次
\+ : 表示連續出現 1 次或多次
{min,max} : 表示至少連續出現 min 次,但最多連續出現 max 次。
``/\w*\d/``
`"a1b2c3d4af"`
會盡量匹配 \w+ 再匹配\d => "a1b2c3d4"
**量詞忽略優先**
??
*?
+?
{min,max}?
``/\w*?\d/``
`"a1b2c3d4af"`
會先優先忽略 + 只匹配\w\d => "a1"
### Non-Capturing Group
``(?:)`` 表示僅需要用作 group 的用途,但不需要擷取群組。
(?:https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?
Match "http://stackoverflow.com/"
Group 1: "stackoverflow.com"
Group 2: "/"
### lookahead 正向預查
意思是「往前看」,分為 positive 和 negative:
- Positive lookahead : X(?=Y)
- Negative lookahead : X(?!Y)
解釋為: 要找一個X後方為(匹配/不匹配)Y
### lookbehind 負向預查
意思是「往後看」,分為 positive 和 negative:
- Positive lookbehind : (?<=Y)X
- Negative lookbehind: (?<!Y)X
解釋為:要找一個X前面(匹配/不 匹配)Y
注意 :
1. () 內代表的是條件,不會被capture
2. 若X沒指定則無法找到group,但可以replace
3. 正、負向預查非每種語言都支援
### 替換
只能用在取代模式 (replacement) 下的語法。
``\${number}``: number 表示匹配的群組 (capturing group),群組編號從 1 開始 \$1。\$ 後面接著的所有數字都會被解讀為屬於 number 群組,如果這不是你希望的,你可以用 \${number} 語法,例如用 \${1}1 就不會被解讀為第 11 個群組,而是第 1 個。
``\${name}``: 用來引用 Named Capturing Group 的值。
``\$\$``: 用來跳脫 (escape) $ 的特殊意義,表示\$字元。
``\$&``: 用來引用整個匹配的字串。
``\$``: 用來引用匹配字串的前面的所有字 (before match)。
``\$``: 用來引用匹配字串的後面的所有字 (after match)。
``\$+``: 用來引用匹配的最後一個群組。
``\$_``: 用來引用整個輸入的字串。
from
[https://www.fooish.com/regex-regular-expression/](https://www.fooish.com/regex-regular-expression/)
[https://amobiz.github.io/2014/08/03/regular-expression-javascript-study-notes-1-theory-1/](https://amobiz.github.io/2014/08/03/regular-expression-javascript-study-notes-1-theory-1/)
//11112222****444 => 1111 2222 **** 4444
str.replace(/([\d\*]{4})(?=([\d\*])+)/g, '$1 ');
str.replace.(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
練習
'1234567'.replace(/((.)([^\*]))/g,'$2*'); 每2換成
課題
(.*)( (?<="RsTime":")[.]*" )(.*)
{"Header":{"RsTime":"20201201170122","FmMsgID":"16564fea-ace5-48f9-aae6-5860cb7800b5","TxnName":"NNBUALoginRs","SKID":"","StatusCode":"0000","Encoding":"UTF-8"},"Body":{"Status":"0A070","Process":"1","UnName":"","ParentID":"A155748976","Kinship":"1","IsAuthentication":"1","DigiVerifyKind":"FX","HouseholdBookStatus":"0","InPersonStatus":"0","CitiPerCertStatus":"0","SID":"1da7e7e7-7714-4e57-89bd-263e56767ee7","ParentType":"2"}}