Java 正则词边界

Java 正则词边界,java,regex,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

我正在按单词边界拆分字符串

我期待的是:

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

有人能告诉我哪里出了问题吗?以及可能的更正(如果有),

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

除非字符串比示例更复杂,否则这是另一个实例,您可以在其中拆分空间:

" 0 +Ve".split(" ");
这将生成以下数组:
[“”,“0”,“+Ve”]

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


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

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

   }
}

@pb2q和@Hovercraft都已经解释了为什么单词boundary在您的情况下不起作用。另一种方法是使用
模式
捕获每个组,这将为您提供您想要的:

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));
String str=“0+Ve”;
Pattern p=Pattern.compile((|[^]+));
匹配器m=p.Matcher(str);
List tokens=new ArrayList();
while(m.find()){
添加(m.group(1));
}           
System.out.println(“令牌0”+令牌.get(0));
System.out.println(“令牌1”+令牌.get(1));
System.out.println(“令牌2”+令牌.get(2));
System.out.println(“令牌3”+令牌.get(3));

不,那只会给你三个代币。谢谢,@pb2q。你的解决方案提供了很好的选择。我喜欢气垫船的解决方案谢谢,乔。你的解决方案正是我想要的,但是需要多写一些行。我喜欢气垫船solution@Firmview当前位置Joao的解决方案非常好,也许比我的好。1+
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));