顯示具有 Regular Expression 標籤的文章。 顯示所有文章
顯示具有 Regular Expression 標籤的文章。 顯示所有文章

2012-06-22

使用 Regular Expression 處理 Windows 目錄名稱不允許字元

據說 Windows 目錄名稱不能使用以下這些字元:
  • \
  • /
  • :
  • *
  • ?
  • "
  • <
  • >
  • |
為了要在 Java 建立使用者自訂名稱的目錄,所以在建立之前得先處理一下使用者輸入的名稱,假設都把上述的不允許字元都取代為底線「_」,那一般的 replace 用起來就很累,這時還是得翻出既強大又很天書的 Regular Expression 來。
String t = "a\\b/c:d*e?f\"g'h<i>j|k"; // 多加了一個單引號
t = Pattern.compile("[\\\\/:*?\"'<>|]").matcher(t).replaceAll("_"); // 天書在此
只有反斜線(\)和雙引號(")要特別處理,而且一次要用四個反斜線才能掉一個反斜線。

事情一下就結束了!

2007-03-29

[Gain] Highlight Keywords

專案上遇到的一個需求:輸入一個關鍵字進行查詢,必須將查詢結果中該關鍵字進行『高光』(highlight)。

首先,查詢不管是用db或index(Lucene)都可以『不分大小寫』,然後將查詢結果在顯示時用replace的方式在關鍵字的前後加上highlight,像是:
    春天    ->    <b>春天</b>
中文關鍵字沒啥問題,麻煩在英文字highlight上,如果原文是這樣『Spring spring SPRING』,按照之前的作法就會變成『<b>spring</b> <b>spring</b> <b>spring</b>』,原文的大小寫不見了。
問題就在於『尋找』可以不分大小寫,但是『取代』只能用一種方式,就是當初指定要不分大小寫的樣子。

後來在RE找到救贖:

String inputStr = "Spring spring SPRING";
// 不分大小寫作搜尋,括號是重點
Pattern pattern = Pattern.compile("(spring)", Pattern.CASE_INSENSITIVE);
// Pattern pattern = Pattern.compile("(?i)(spring)");
Matcher matcher = pattern.matcher(inputStr);
// $0 表示第一組括號內的字串
String result = matcher.replaceAll("<b>$0</b>");
// <b>Spring</b> <b>spring</b> <b>SPRING</b>
System.out.println(result);