2

文字列を単語の境界で分割しています。

私が期待しているのは:

 TOKEN 0  
 TOKEN 1 0
 TOKEN 2  
 TOKEN 3 +Ve

そして、私が得ているのは、

 TOKEN 0  
 TOKEN 1 0
 TOKEN 2  +
 TOKEN 3 Ve



public void StringExample(){
    String str = " 0 +Ve";

    String[] token = str.split("\\b");

    System.out.println("TOKEN 0 " + token[0]);
    System.out.println("TOKEN 1 " + token[1]);
    System.out.println("TOKEN 2 " + token[2]);
    System.out.println("TOKEN 3 " + token[3]);
}

誰かがそれがうまくいかないところの手がかりを与えることができますか?および可能な修正(ある場合)、

4

3 に答える 3

3

@ pb2qと@Hovercraftはどちらも、あなたの状況で単語の境界が機能しない理由をすでに説明しています。別の方法は、を使用してPattern各グループをキャプチャすることです。これにより、必要なものが得られます。

String str = " 0 +Ve";
Pattern p = Pattern.compile("( |[^ ]+)");
Matcher m = p.matcher(str);
List<String> tokens = new ArrayList<String>();
while (m.find()) {
  tokens.add(m.group(1));
}           
System.out.println("TOKEN 0 " + tokens.get(0));
System.out.println("TOKEN 1 " + tokens.get(1));
System.out.println("TOKEN 2 " + tokens.get(2));
System.out.println("TOKEN 3 " + tokens.get(3));
于 2012-08-20T23:26:27.780 に答える
2

何も問題はなく、期待どおりの結果が得られます。単語の境界は、文字列の最初の文字の前、文字列の最後の文字の後、および文字列内の2つの文字の間で一致します。一方は単語文字で、もう一方は単語文字ではありません。最後のルールでは、「+」と「V」が一致するため、結果は完全に理にかなっています。

おそらく、スペースの横にあるものと一致するように、先読みと後ろ見を使用する必要があります。例えば:

public class Foo001 {
   // private static final String REGEX1 = "\\b";
   private static final String REGEX2 = "(?= )|(?<= )";

   public static void main(String[] args) {
      String str = " 0 +Ve";

      String[] tokens = str.split(REGEX2);
      for (int i = 0; i < tokens.length; i++) {
         System.out.printf("token %d: \"%s\"%n", i, tokens[i]);
      }

   }
}

これは、追加のトークンを与える最初のスペースの左側にも一致します。

token 0: ""
token 1: " "
token 2: "0"
token 3: " "
token 4: "+Ve"
于 2012-08-20T23:19:35.863 に答える
1

+単語境界の単語文字としてカウントされません。単語の文字は[a-zA-Z_0-9]、つまり英数字であり、アンダースコアです

文字列が例よりも複雑にならない限り、これはスペースを分割できる別のインスタンスです。

" 0 +Ve".split(" ");

これにより、次の配列が生成されます[" ", "0", "+Ve"]

これはあなたが期待するトークンリストと完全には一致しませんが、あなたの目的に合うかもしれません。このトークンリストを使用すると、先頭にスペース文字があることがわかり、3番目のトークンとしてスペースを推測できます。

この方法で分割する場合の問題は、複数のスペース文字が" "結果の配列に追加のトークンを生成することです。

于 2012-08-20T23:12:16.773 に答える