2016-11-03 12 views
2

通り、住宅番号、郵便番号、都市を取得するには、カスタム(ドイツ語)のアドレス文字列に一致させる必要があります。私はRegExrJava Visual Regex Testerで動作する正規表現を持っています。正規表現がJavaで動作しないのはなぜですか?

これは正規表現(配信が、編集可能)です:

^([^0-9]+)([0-9]+.*?)?(?:\w)?([0-9]{5})(?:\w)?(.*)$ 

これは文字列です:

NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg 

は、これは私のコードです:スプリット用として

String regex = "^([^0-9]+)([0-9]+\\.*?)?(?:\\w)?([0-9]{5})(?:\\w)?(\\.*)$"; 
String address = "NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg"; 
Pattern pattern = Pattern.compile(regex); 
String[] addrFromRegex; 

// gives an array (length 1) with [0] == address 
addrFromRegex = address.split(regex); 

// gives an array (length 1) with [0] == address 
addrFromRegex = pattern.split(address); 

() 、問題はエスケープの誤りかもしれません。しかしパターンのために私はこれに気を付ける必要はないと思った。私は間違って何をしていますか?

更新:

ザ・、文字列には常に与えられていません。可能なアドレス文字列は次のとおりです。

NEUE BÜHNE Senftenberg; Theaterpassage 1; 01968 Senftenberg 
NEUE BÜHNE Senftenberg Theaterpassage 1 01968 Senftenberg 
NEUE BÜHNE Senftenberg|Theaterpassage|1|01968|Senftenberg 
NEUE BÜHNE Senftenberg|Theaterpassage_1_01968_Senftenberg 
... 

私はXMLでアドレスを取得していますが、提供されるデータには何の影響もありません。ところで、ここで提供されるアドレスは、障害のあるアドレスの例です。私もそれらに対処しなければならない。

+3

あなたが分割し、ないと一致する必要があります。 –

+0

なぜあなたの式のJava版で '.'の前に\\を追加しましたか? – khelwood

+1

'(?:\ w)?'は*非*単語の文字にマッチすると考えられていたので、 '\ W? 'でなければなりません。 [このJavaデモ](http://ideone.com/ZDljlb)をチェックしてください。 –

答えて

2

主なポイントは、あなたのパターンがと一致することです。あなたが持っている文字列を一致させることです。したがって、splitの代わりにPattern#matches()を使用し、取得した値をリスト/配列/ etcに収集する必要があります。

固定正規表現は

"^([^0-9]+?)\\s*([0-9]+)[\\W_]+([0-9]{5})\\s*(.*)$" 

enter image description here

詳細ある:

  • ^ - 文字列の先頭(matches()に必要ではない) - ([^0-9]+?) - グループ1:一又は数字以外ではなく、可能な限り少ない文字5桁の数字
  • を捕捉グループ3 - 非単語または_
  • ([0-9]{5})のいずれかである1またはそれ以上の文字 - 1+数字
  • [\\W_]+をキャプチャグループ2 - E
  • \\s* - 0+空白
  • ([0-9]+)\\s* - ゼロ以上の空白
  • (.*) - グループ4 行の残りをキャプチャします。
  • $ - 文字列の最後(matches()では不要)。

Java demo

List<String> lst = new ArrayList<>(); 
String s = "NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg"; 
Pattern pattern = Pattern.compile("([^0-9]+?)\\s*([0-9]+)[\\W_]+([0-9]{5})\\s*(.*)"); 
Matcher matcher = pattern.matcher(s); 
if (matcher.matches()){ 
    lst.add(matcher.group(1)); 
    lst.add(matcher.group(2)); 
    lst.add(matcher.group(3)); 
    lst.add(matcher.group(4)); 
} 
System.out.println(lst); // => [NEUE BÜHNE Senftenberg, Theaterpassage, 1, 01968, Senftenberg] 
+0

ありがとうございます。 String#split()が機能しない理由はありますか? 説明のために:Wiktorが他の誰よりも先にコメントにソリューションを提供していたので、私はこの回答に合格とマークしました。 – aProgger

+0

'split'を使いたい場合は、保持したくないテキストにマッチするパターンを書く必要があります。 –

0

私はあなたが正規表現であなたの方法を変更する必要があると思う、私はこのコードのあなたのporposeは、アドレスが一致した場合は、trueがこのアドレスを取得する場合、チェックだと思います。

こぼれた

String source = "foo,bar" ; 

String[] result = source.split(","); // you will get {"foo","bar"} 

あなたは正規表現をチェックしたい場合は、代わりにマッチを使用する必要があります。

// check if the address is matched with your regex 
boolean isMathed= address.matches(regex); 

// if matched set result variable with address 
addrFromRegex = (isMatched ? address : null); 
+0

ご協力いただきありがとうございますが、私は「、」と分けることはできません。 "、"のない文字列があります。私は私の質問でこれを言及しなかった。そのために残念。 – aProgger

1

次のコードで起動することができます。

String regex = 
    "^([\\p{L}\\s]+)(?:[,\\s]+)([\\p{L}\\s]+[0-9]+)(?:[,\\s]+)([0-9]{5}[\\p{L}\\s]+)$"; 
String address = "NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(address); 
matcher.matches(); 
System.out.println(matcher.group(1) + ":" + matcher.group(2) + ":" + matcher.group(3)); 
関連する問題