2017-05-18 5 views
1

近く違法繰り返し私はJava8を使用していますが、文字列からアドレスをフィルタリングするために、次の正規表現を使用したいが、私はこのエラーを取得:java.util.regex.PatternSyntaxException:インデックス

エラー

すべてのヘルプは感謝

private static final String REGEX_ROAD = "(?i)\\b(street|st|road|rd|avenue|ave|drive|dr|loop|court|ct|circle|cir|lane|ln|boulevard|blvd|way)\\.?\\b"; 
private static final String REGEX_APT = "(?i)\\b(apt|bldg|dept|fl|hngr|lot|pier|rm|ste|slip|trlr|unit|#)\\.? *[a-z0-9-]+\\b"; 
private static final String REGEX_POBOX = "/P\\.? ?O\\.? *Box +\\d+"; 

private static final String REGEX_STREET = "(\\d+\\s*(\\w+){1,2}${"+REGEX_ROAD+"}(\\s+${"+REGEX_APT+"})?)|(${"+REGEX_POBOX+"})"; 

    input = input.replaceAll(REGEX_STREET, "<ADDRESS>"); 

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 18 
(\d+\s*(\w+){1,2}${(?i)\b(street|st|road|rd|avenue|ave|drive|dr|loop|court|ct|circle|cir|lane|ln|boulevard|blvd|way)\.?\b}(\s+${(?i)\b(apt|bldg|dept|fl|hngr|lot|pier|rm|ste|slip|trlr|unit|#)\.? *[a-z0-9-]+\b})?)|(${/P\.? ?O\.? *Box +\d+}) 
       ^

コード。

クラス全体:Javaは、文字列の補間をサポートしていません

package com.jobs.spring.service.replace; 

public class ReplaceServiceImpl implements ReplaceService { 

    private static final String REGEX_ROAD = "(?i)\\b(street|st|road|rd|avenue|ave|drive|dr|loop|court|ct|circle|cir|lane|ln|boulevard|blvd|way)\\.?\\b"; 
    private static final String REGEX_APT = "(?i)\\b(apt|bldg|dept|fl|hngr|lot|pier|rm|ste|slip|trlr|unit|#)\\.? *[a-z0-9-]+\\b"; 
    private static final String REGEX_POBOX = "/P\\.? ?O\\.? *Box +\\d+"; 

    private static final String REGEX_STREET = "(\\d+\\s*(\\w+){1,2}${"+REGEX_ROAD+"}(\\s+${"+REGEX_APT+"})?)|(${"+REGEX_POBOX+"})"; 

    @Override 
    public String removePII(String input) { 
     input = input.replaceAll(REGEX_STREET, "<ADDRESS>"); 
     return input; 
    } 

    public static void main(String[] args) { 
     ReplaceService rep = new ReplaceServiceImpl(); 
     System.out.println(rep.removePII("1234 Flex Road and 21 happy street")); 
    } 
} 
+4

'$ {'とそれに続く '}'を削除すると、パターンを動的に構築するのに十分です。 –

+0

もう一度WiktorStribiżewさん、ありがとうございました。 – Richard

+0

他の人があなたの質問に入れて答えを受け入れる努力を感謝してみませんか? – kism3t

答えて

6

${...} JavaScriptのようなテンプレートリテラルのプレースホルダがサポートされていないため、リテラルシンボルとして扱われます。

$は文字列の末尾を意味し、ゼロ幅アサーションであるため、数値化しないでください。しかし、Java正規表現エンジンはユーザにとっては寛容であり、ゼロ幅アサーション(0,235,の意味もありませんが、指定された位置に文字列の1つの終端しかない)を使用して数量子を使用することができます。

ここでの大きな問題は、{(制限数量詞の開始)は繰り返しの回数を表す数で従わなければならないと数字以外の記号がある場合、}または,MAX_REPEATITION_VALUE}に続く数が、何ということです不正な繰り返しエラーが表示されます。

${}を削除してください。

String REGEX_STREET = "(\\d+\\s*(\\w+){1,2}"+REGEX_ROAD+"(\\s+"+REGEX_APT+")?)|("+REGEX_POBOX+")"; 

Java demoを参照してください。

関連する問題