2017-10-18 2 views
1

JavaでPatternを作成して文書の行を分割しようとしています。 WordCountの例のデフォルトのPatternは、"\\s*\\b\\s*"のようなものです。 しかし、このパターンの問題は、すべての単語を1つの単語に分割することです。一方、私は(私はあなた、それは一緒です。Regexがすべての単語を捕まえ、Javaの "私はあなただよ"

Pattern BOUNDARY = "[a-zA-Z]+'{0,1}[a-zA-Z]*" 
String test = "Hello i'm @£[email protected] @@can !!be. 

for(String word : BOUNDARY.split(test){ 
    println(word)} 

を実行して、私は何の結果を得るません:これまでのところ、私が試したことは[a-zA-Z]+'{0,1}[a-zA-Z]*で、

問題は、私は例えばテスト文字列を、持っているときということです。理想的には、私が手に入れたい

Hello 
i'm 
you 
can 
be 

アイデアは大歓迎です。 regex101.comでは、私は正規表現を魅力的なものにしていますので、私はJavaの部分で何か誤解していると思います。

+0

*一致する*正規表現で、重複していないすべてのオカレンスを取得するには 'Matcher.find()'を使用してください。 –

答えて

1

最初のパターンは、0以上の空白パターンで囲まれた単語境界で分割されていました。 2番目のパターンは、と一致する部分文字列です。

はこのようにそれを使用します。

String BOUNDARY_STR = "[a-zA-Z]+(?:'[a-zA-Z]+)?"; 
String test = "Hello i'm @£[email protected] @@can !!be."; 
Matcher matcher = Pattern.compile(BOUNDARY_STR).matcher(test); 
List<String> results = new ArrayList<>(); 
while (matcher.find()){ 
    results.add(matcher.group(0)); 
} 
System.out.println(results); // => [Hello, i'm, you, can, be] 

  • [a-zA-Z]+一致した私は[a-zA-Z]+(?:'[a-zA-Z]+)?を使用Java demo

    注を参照してください - 1以上のASCII文字

  • (?:'[a-zA-Z]+)? - オプションの部分文字列を
    • ' - アポストロフィ
    • [a-zA-Z]+ - あなたはまた、非単語の文字で囲まれているだけの一致ワードのワード境界でパターンを包むこと

1以上のASCII文字、"\\b[a-zA-Z]+(?:'[a-zA-Z]+)?\\b"

すべてのUnicode文字を見つけるには、"\\p{L}+(?:'\\p{L}+)?"を使用してください。

+0

ありがとう、私は私の心の中で何かが間違っていると思った、ちょうどそれを修正する方法がわからなかった。オプションの部分文字列にこの構文を使用するのはなぜですか?それは私のバージョンよりも最適ですか? – CnewbieWannabePro

+0

'a + '?a *'を使うと 'a''とマッチします。また、 '' 'が文字列にない場合、パターンはほとんど意味をなさない' a + a * 'として機能します。私の例ではバックトラッキングが少なくて済む。 'a 'とマッチする必要がある場合は、最後の' + 'を' * 'に置き換えてください。 –

関連する問題