0

Rubyで数年間休止した後、Javaに戻ります。次のRubyステートメントを実現する慣用的で短いJavaコードを探しています。

some_string.scan(/[\w|\']+/)

上記の式は、文字列から配列を作成します。some_string配列内の要素は、英数字(\w)またはアポストロフィのいずれかで構成されるすべてのセクションです( \'「John's」が2つの単語に分割されないようにするため)。

例えば:

"(The farmer's daughter) went to the market".scan(/[\w|\']+/)

=>

["The", "farmer's", "daughter", ...]

アップデート

私は、ソリューションが次のようなものを使用することを知っています:

String[] words = sentence.split(" ");

に入る正規表現部分が必要ですsplit()

4

3 に答える 3

3

Javaにはscan、関数呼び出しでこれを実行できる組み込みメソッドがないため、ループを自分でロールする必要があります。Matcherこれは、Javaの正規表現クラスを使用して非常に簡単に行うことができます。

import java.util.regex.*;

String yourString = "(The farmer's daughter) went to the supermarket";

/* The regex syntax is basically identical to Ruby, except that you need
 * to specify your regex as a normal string literal, and therefore you need to 
 * double up on your backslashes. The other differences between my regex and 
 * yours are all things that I think you need to change about the Ruby version
 * as well. */
Pattern p = Pattern.compile("[\\w']+");
Matcher m = p.matcher(yourString);
List<String> words = new Vector<String>();
while (m.find()) {
   words.add(m.group());
}

この状況で使用すること Matcherと使用することの相対的なメリットが何であるかはわかりません。Scanner

于 2012-04-19T01:02:52.230 に答える
2

正規表現は、言語間でもほぼ同じように動作する必要があります。この場合、唯一の違いは、円記号と一重引用符をエスケープする必要があることです。

Rubyで書く/[\w']+/場合、Javaで書くでしょうPattern.compile("[\\w\']+")


ああ、 sはsScannerもスキャンできStringます!

final String s = "The farmer's daughter went to the market";
Scanner sc = new Scanner(s);
Pattern p = Pattern.compile("[\\w\\']+");
while (sc.hasNext(p)) { System.out.println(sc.next(p)); }

まったく同じではありませんsplitが、単語の境界であるスペースの文字列はどうでしょうか。

"The farmer's daughter went to the market".split("\s");
于 2012-04-18T23:19:15.973 に答える
0

どうですか

String[] words = test.split("[^a-zA-Z0-9']+");

また

words = test.split("[^\\w']+");

これらのパターンとRubyの例との違いは、RubyのString#scanを使用していたためです。ここでは、単語に一致するパターンを指定します。JavaのString#splitは、同じ名前のRubyのメソッドに似ています。つまり、単語の区切り文字に一致するパターンを指定します。

于 2012-04-19T00:48:34.853 に答える