Created
May 9, 2025 12:34
-
-
Save agwlvssainokuni/01eb50975ab46d78e090806e4cf08539 to your computer and use it in GitHub Desktop.
expected の特殊文字をエスケープして正規表現として actual と照合する。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
String expected = "...."; | |
String actual = "...."; | |
String REGEXP_METACHAR_PATTERN = "[.?*+^$|\\\\(){}\\[\\]]"; | |
Matcher matcher = Pattern.compile(REGEXP_METACHAR_PATTERN).matcher(expected); | |
boolean result = Pattern.matches( | |
"^" + matcher.replaceAll(mr -> "\\\\\\" + mr.group()) + "$", | |
actual | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
"\\\\\\" の背景
"\\"
(1文字のエスケープ文字「\」と1文字のエスケープ対象「\」)で表される。mr -> "\\" + mr.group()
」で特殊文字の前に「\」(1文字)が付くように見える。mr -> "\\" + mr.group()
」だと Function は「\+特殊文字(1文字)」を返却するが、replaceAll() の仕様により「エスケープ文字(\)+特殊文字(1文字) => 特殊文字(1文字)」となって置換される。(特殊文字(1文字)を特殊文字(1文字)で置換することになるので結果としては元と同じ文字列が返却される)mr -> "\\\\\\" + mr.group()
」とする。この Function は「\\\(3文字)+特殊文字(1文字)」を返却する。こうすると replaceAll() の仕様により前半は「 \\(2文字) = エスケープ文字(1文字)+エスケープ対象(\ 1文字) => \(1文字)」、後半は「\(1文字)+特殊文字(1文字) = エスケープ文字(1文字)+特殊文字(1文字) => 特殊文字(1文字)」となり、期待する「\(1文字)+特殊文字(1文字)」に置換される。