【问题标题】:Splitting strings with regex. Java [duplicate]用正则表达式分割字符串。 Java [重复]
【发布时间】:2015-02-17 17:01:04
【问题描述】:

我试图用单词填充 ArrayList,但有时它会添加一个空字符,为什么?我怎样才能避免这种情况?

    ArrayList<String> textAL = new ArrayList<String>();
    String text = "This.IS(a) text example blah? bl:ah";
    String regex = "[\\s\\?\\.,:;\\)\\(]";

    String[] splittedText = text.split(regex);

    for(int i = 0; i < splittedText.length; i++){
        if(splittedText[i] != " "){  //ignore whitespace
            textAL.add(splittedText[i]);
        }           
    }

    for(int i = 0; i < textAL.size(); i++){
        System.out.println("t2(" + i + ") "+ textAL.get(i));
    }

结果:

textAL(0) This
textAL(1) IS
textAL(2) a
textAL(3) 
textAL(4) text
textAL(5) example
textAL(6) blah
textAL(7) 
textAL(8) bl
textAL(9) 
textAL(10) ah

【问题讨论】:

  • "[\\s\\?\\.,:;\\)\\(]+"?或"\\W+"?
  • 我敢打赌 split 方法引入了空字符串,其中两个分隔符彼此相邻(如果在开头和结尾匹配)

标签: java regex arraylist split


【解决方案1】:

你需要给你的Pattern添加一个量词:

String text = "This.IS(a) text example blah? bl:ah";
// Edit: now with removed escapes when not necessary - thanks hwnd
//              ┌ original character class
//              |          ┌ greedy quantifier: "one or more times"
//              |          |
String regex = "[\\s?.:;)(]+";
String[] splittedText = text.split(regex);
System.out.println(Arrays.toString(splittedText));

输出

[This, IS, a, text, example, blah, bl, ah]

【讨论】:

  • 很好的解释。一加
  • @HovercraftFullOfEels 谢谢!我买的是黑色的还是白色的? :D
  • 明白!谢谢楼主:)
  • @Frankovich 不客气!请务必查看HovercraftString 比较的附加说明。
  • 我相信你可以避免在这里逃避很多,[\\s?.,:;()]+
【解决方案2】:

我认为问题在于您忘记了正则表达式末尾的+,例如,

String regex = "[\\s\\?\\.,:;\\)\\(]+"

但是像

这样简单的东西怎么样
String regex = "\\W+";

注意\\W^\\w是一样的

测试:

public static void main(String[] args) {
  ArrayList
  <String> textAL = new ArrayList<String>();
  String text = "This.IS(a) text example blah? bl:ah";
  // String regex = "[\\s\\?\\.,:;\\)\\(]+";
  String regex = "\\W+";

  String[] splittedText = text.split(regex);

  for(int i = 0; i < splittedText.length; i++){
      textAL.add(splittedText[i]);
  }

  for(int i = 0; i < textAL.size(); i++){
      System.out.println("t2(" + i + ") "+ textAL.get(i));
  }
}

结果:

t2(0) This
t2(1) IS
t2(2) a
t2(3) text
t2(4) example
t2(5) blah
t2(6) bl
t2(7) ah

编辑

您的其他问题在这里:

splittedText[i] != " "

您正在使用!= 运算符比较字符串,并且您永远不想使用==!= 比较字符串。相反,使用equals(...)equalsIgnoreCase(...) 方法。了解==!= 检查两个对象是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否以相同的顺序具有相同的字符,这就是这里重要的事情。

幸运的是,如果您使用正确的正则表达式,上述内容对您当前的代码来说不是问题,但有可能成为未来代码的问题,所以请牢记这一点。

【讨论】:

  • 投下反对票——想发表评论吗?顺便说一句,我的代码可以工作。
  • 好的,谢谢你的建议
【解决方案3】:

String regex = "[^\\w]+"; 怎么样,这样做是为了添加自己不想匹配的字符,比如撇号 "[^\\w']+"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多