# 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"}}