2016-08-02 14 views
1

文字列があり、文字列から部分文字列を抽出するためには正規表現が必要でした。パイプ文字を含むテキストを抽出する正規表現

例:this is a|b|c|d whatever e|f|g|h
結果:次のようにa|b|c|d, e|f|g|h

は、しかし、私が書いたJavaコードに基づいて、それは結果を生産している:

Pattern ptyy = Pattern.compile("\\|*.+? "); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whatever e|f|g|h"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 

結果

this 
is 
a|b|c|d 
whatever 

結果は私が望んでいたものではありませんr。何かアドバイス?

+2

お試しください['/[^\s|]+(?:\|[^\s|])+/g'](https://regex101.com/r/aL9bL4/1) –

+0

一文字が欲しいですか?あるいは、 'foo | bar | baz | qux'はマッチしますか?また、常に正確に4項であるか、 'a | b | c'が一致する必要がありますか? – Bohemian

+0

私はまた、foo | bar | baz | qux、foo2 | ba2r | baz | qux5と一致したいと思っています –

答えて

1

あなたの\|*.+?パターンは、0個以上のパイプに一致し、最初のスペースまでの改行以外の任意の1文字以上の文字に一致します。したがって、文字列内の空白以外のチャンクのほとんどすべてに一致します。

abcは単なるプレースホルダであり、任意の非空白文字があることができ、私がお勧めしたい場合:

    [^\s|]+(?:\|[^\s|])+ 
    

    regex demo

    詳細を参照してください。

  • [^\s|]+ - 空白以外の1つ以上の文字と|
  • (?:\|[^\s|])+ - の1又はそれ以上の配列:
      \|
    • - リテラル|
    • [^\s|] - 空白以外の1以上の文字と|

Java demo

Pattern ptyy = Pattern.compile("[^\\s|]+(?:\\|[^\\s|])+"); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whatever e|f|g|h"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 
2

私はこの正規表現は十分(.\|)+.

だと思うが、これはすべてのa|b|...|と最後.は、部分文字列の最後の文字を見つける見つけるexample

(.\|)参照してください。

0

あなたの助言に基づいて、パイプ表現のさまざまな組み合わせに対応できる独自の正規表現を思いつきました。

Pattern ptyy = Pattern.compile("[^\\s|]+(?:\\|[^\\s|])+"); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whater e|f|g|h and Az|09|23|A3 and 22|1212|12121|55555"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 

これが結果に

a|b|c|d 
e|f|g|h 
Az|09|23|A 
22|1212|12121|5 

みんなありがとうを得るために私を可能にします!

+0

申し訳ありませんが、正に*正規表現**私は[私の答え](http:// stackoverflow.com/a/38716040/3832970)。それがあなたのために働くならば、重複した解決策を投稿するポイントはありません。この投稿を削除し、私の答えを受け入れることを検討してください。 –

関連する問題