3

以下では、結果から除外しようとしている郵便番号を考えてみましょう33333-
そうです:

String zip = "11111 22222 33333- 44444-4444";
String regex = "\\d{5}(?(?=-)-\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(zip);
while (matcher.find()) { 
   System.out.println(" Found: " + matcher.group());     
}

取得することを期待:

Found:  11111  
Found:  22222  
Found:  44444-4444

次の形式を強制しようとしています:
5 桁の後にオプションで - と 4 桁。- (ハイフン) だけの 5 桁は必要ありません

例外が発生します:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 7
\d{5}(?(?=-)(-\d{4}))
       ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.group0(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)

条件付き先読みを正しく使用していませんか?

4

4 に答える 4

6

33333 以外のすべての数字を取得するには、次のコードを使用します。

String zip = "11111 22222 33333- 44444-4444";
String regex = "\\d{5}(?=(-\\d{4}|\\s|$))(-\\d{4})?";
Matcher m = Pattern.compile(regex).matcher(zip);
while(m.find())
    System.out.printf("Macthed: [%s]%n", m.group(1));

出力:

Macthed: [11111]
Macthed: [22222]
Macthed: [44444-4444]

説明:この RegEx は、それ自体が条件のようなものである先読みを使用しています。つまり、5 桁の数字に一致し、その後に 4 桁またはスペースまたは文字列の終わりが続き、オプションでテキストと 4 桁が一致することを意味します。

正規表現の一部に構文エラーがあるため、元の正規表現が例外をスローしている理由?:(?=-)

于 2012-01-20T18:22:31.423 に答える
0
(\d{5}(?!-\s)(?:-\d{4})?)

したがって:

String regex = "(\\d{5}(?!-\\s)(?:-\\d{4})?)";`
于 2012-01-21T03:22:16.723 に答える
0

あなたの質問は私には少し不明確です。私はあなたが探していると思います:

String st = "11111 22222 33333- 44444-4444";
String pattern = "\\d+(- )";
String res  = st.replaceAll(pattern,"");
System.out.println(res);

出力 =11111 22222 44444-4444

于 2012-01-20T17:56:49.217 に答える
0

の後にコロンがありません(?。つまり、この regex (non-Java-String): を使用してください\d{5}(?:(?=-)-\d{4})

ただし、これでも目的の結果が得られない場合があります。入力例と必要な出力を投稿してください。

于 2012-01-20T17:43:45.520 に答える