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 都已经解释了为什么单词边界在您的情况下不起作用。另一种方法是使用 aPattern并捕获每个组,这将为您提供所需的内容:

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

没有任何问题,结果也符合预期。单词边界在字符串的第一个字符之前、字符串的最后一个字符之后以及字符串中的两个字符之间匹配,其中一个是单词字符,另一个不是单词字符。最后一条规则将导致“+”和“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"]

这与您期望的令牌列表不太匹配,但可能适合您的目的。通过这个标记列表,您知道有一个前导空格字符,并且您可以推断出一个空格作为第三个标记。

以这种方式拆分的一个问题是多个空格字符会" "在结果数组中产生额外的标记。

于 2012-08-20T23:12:16.773 回答