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