[英]Escape each literal in regex string instead of quote the entire string
這里的答案建議使用Pattern.quote
來轉義特殊的正則表達式字符。
Pattern.quote
的問題在於,它會將整個字符串轉義,而不是每個特殊字符自己轉義。
這是我的情況:
我從用戶那里收到一個字符串,需要在文檔中搜索它。 由於用戶不能傳遞換行符(這是我無法訪問的第三方API中的錯誤),因此我決定將任何空白序列都視為“ \\ s +”,並使用正則表達式來搜索文檔。 這樣,用戶可以發送簡單的空格而不是換行符。
例如,如果文檔是:
\\ s元字符用於查找空格字符。
空格字符可以是:
空格字符 制表符 回車符 換行符 垂直制表符 換頁字符
然后收到的字符串
String receivedStr = "The \s metacharacter is used to find a whitespace character. A whitespace character can be:";
應該在文檔中找到。
為了達到這個目的,我想引用字符串,然后用字符串“ \\ s +”替換任何空格序列。
使用以下代碼:
receivedStr = Pattern.quote(receivedStr).replaceAll("\\s+", "\\\\s+");
產生正則表達式:
\\ QThe \\ S + \\ S \\ S +元字符\\ S +是\\ S +使用\\ S +到\\ S +找到\\ S + A \\ S +空白\\ S +字符。\\ S + A \\ S +空白\\ S +字符\\ S +可\\ S +是:。\\ E
那當然會忽略我添加的"\\s+"
而不是預期的:
所述\\ S + \\\\小號\\ S +元字符\\ S +是\\ S +使用\\ S +到\\ S +找到\\ S + A \\ S +空白\\ S +字符。\\ S + A \\ S +空白\\ S +字符\\ S +可\\ S +是:
僅轉義“ \\ s”文字而不是整個字符串。
是否有Pattern.quote
的替代方法,可以轉義單個文字而不是整個字符串?
我建議這樣的事情:
String re = Stream.of(input.split("\\s+"))
.map(Pattern::quote)
.collect(Collectors.joining("\\s+"));
這樣可以確保所有內容都被引用(包括否則將被解釋為環顧四周並可能導致匹配查找中指數級膨脹的內容),並且任何輸入空格的用戶最終都被引用為未引用\\s+
。
輸入示例:
Lorem \\b ipsum \\s dolor (sit) amet.
輸出:
\QLorem\E\s+\Q\b\E\s+\Qipsum\E\s+\Q\s\E\s+\Qdolor\E\s+\Q(sit)\E\s+\Qamet.\E
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.