文字列に対してメソッドを使用String.Split()
してJavaで分割すると、次のように機能します。
String s = "hello my dear";
String[] ss = s.split("[ ]");
配列ss
には含まれています[Hello, my, dear]
が、この場合のスペース (区切り文字) は配列の一部ではありません。
区切り文字が、Java の文字列クラスの分割メソッドを使用して生成された配列の一部である可能性がある方法はありますか。
あなたはこのようにすることができます: -
"hello my dear".split("(?<=[ ])");
空白の直後の空の文字列で分割されます。これにより、次のような要素を持つ配列が得られます: -
hello_
my_
dear
_
スペースを意味します。
区切り文字を別の配列要素にしたい場合は、次のようにすることができます: -
System.out.println(Arrays.toString("a+b=c".split("(?<=[+=])|(?=[+=])")));
これは、空の文字列で分割されるようになりました。この文字列には、後に either が続くか+ or =
、どちらかが先行します+ or =
。したがって、上記の場合に分割が実行されるすべての場所は次のようになります。
a + b = c
^ ^ ^ ^ <-- Empty strings before and after your pattern - `[+=]`
したがって、配列には 5 つの要素があります。
出力: -
[a, +, b, =, c]
しかし、数式の解析に間違ったツールを使用しています。これには正規表現を使用しないでください。
StringTokenizer のオーバーロードされたコンストラクターを使用します。
String s = "hello my dear";
StringTokenizer st = new StringTokenizer(s, " ", true);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
出力:
hello
my
dear
単語の境界で分割できます。
String[] ts = "hello my dear".split("\\b");
System.out.println(Arrays.toString(ts));
[, hello, , my, , dear]
あるいは
public String[] getParts(String s) {
List<String> parts = new ArrayList<String>();
Pattern pattern = Pattern.compile("(\\w+|\\W)");
Matcher m = pattern.matcher(s);
while (m.find()) {
parts.add(m.group());
}
return parts.toArray(new String[parts.size()]);
}
\\w+
これは、単語(小文字の w) または単語以外の文字\\W
(大文字の W)を検索するたびに一致します。