正则表达式词边界

时间:2012-08-20 23:01:09

标签: java regex

我按字边界分割字符串。

我期待的是:

 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]);
}

有人能说出哪里出错吗?和可能的更正,如果有的话,

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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"

答案 2 :(得分:1)

+不计为单词边界的单词char。单词字符为[a-zA-Z_0-9],即字母数字和下划线

除非你的字符串变得比你的例子更复杂,否则这是你可以在空间中拆分的另一个例子:

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

这应该产生这个数组:[" ", "0", "+Ve"]

哪个与您期望的令牌列表不完全匹配,但可能适合您的目的。使用此令牌列表,您知道有一个前导空格字符,您可以将空格推断为第三个令牌。

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