【问题标题】:How do I split string using String.split() without having trailing/leading spaces or empty values?如何在没有尾随/前导空格或空值的情况下使用 String.split() 拆分字符串?
【发布时间】:2012-04-13 20:06:13
【问题描述】:

如何使用 String.split() 拆分字符串,而不使用尾随/前导空格或空值?

假设我有 " ol-ga@assf-rrt.ru ; sdf.an@dfgdfg.com; sdfsdf@fdfd.erff, privet@vvv.fff " 这样的字符串。

我曾经通过调用String.split("[;, ]+") 来拆分它,但缺点是你会得到需要在额外循环中忽略的空数组元素。

我还尝试了String.split("\\s*[;,]+\\s*"),它不提供空元素,但在第一封电子邮件中留下前导空格,在最后一封电子邮件中留下尾随空格,这样生成的数组看起来像因为这些电子邮件旁边没有逗号或分号:

[0] = {java.lang.String@97}"  ol-ga@assf-rrt.ru"
[1] = {java.lang.String@98}"sdf.an@dfgdfg.com"
[2] = {java.lang.String@99}"sdfsdf@fdfd.erff"
[3] = {java.lang.String@100}"privet@vvv.fff  "

是否可以仅使用正则表达式和拆分(不使用额外调用 String.trim()) 获得“干净”电子邮件数组?

谢谢!

【问题讨论】:

  • 为什么不在将字符串添加到数组之前执行 String.trim() ?
  • 因为我没有向数组中添加字符串,所以 String.split 会。

标签: java regex


【解决方案1】:
String input = " ol-ga@assf-rrt.ru ; sdf.an@dfgdfg.com; sdfsdf@fdfd.erff, privet@vvv.fff ";
input = input.replace(" ", "");
String[] emailList = input.split("[;,]+");

我假设你很确定你的输入字符串只包含电子邮件地址,只需要修剪/重新格式化。

【讨论】:

  • 我编辑将string.replace() 调用放在自己的行上;它隐藏在第一条长线的末尾,使这个答案的建议解决方案一开始并不明显。
  • 是的,我认为在拆分之前替换所有空格是这里最优雅的解决方案。
  • 更一般的空间替换是:input.replaceAll("\\s+", "")
  • 字符串替换比普通修剪效率低得多:它确实创建了一个新字符串,而不是重新使用原始字符串中的 char[]。
【解决方案2】:

像这样:

String.split("\\s*(;|,|\\s+)\\s*");

但它在开头给出了一个空字符串(没有办法只使用拆分来摆脱它)。

因此只有这样的事情才能有所帮助:

String.trim().split("\\s*(;|,)\\s*");

【讨论】:

  • 不走运,它给出的结果与 '\\s*[;,]+\\s*' 相同
  • 顺便说一句,我删除了拆分。请参阅我的评论。
  • 您的意思可能是“修剪” :) 您的模式的新版本在结果数组的开头给出了空元素。我开始认为纯正则表达式是不可行的:(
  • 对,我的意思是trim。是的,没有办法摆脱只有正则表达式的起始空间。
  • 不要以为在这些限制下你就能做你想做的事,伙计。必须记住您的正则表达式定义了拆分条件(即匹配之间的内容)。除非您不介意在数组的开头和结尾有空匹配项,否则无法使用纯正则表达式修剪这些匹配项。
【解决方案3】:

直接扔掉:如果你使用 Guava,Splitter 会比使用正则表达式更简单。

Iterable<String> splitStrings = Splitter
 .onPattern("[;,]+")
 .trimResults()
 .split(string);

【讨论】:

    【解决方案4】:

    尝试在拆分结果中使用String.trim()

    【讨论】:

    • 仅使用正则表达式和拆分 :)
    【解决方案5】:

    首先,正如 DGomez 指出的那样:

     String.trim()
    

    在输入字符串中使用它,这样前导和尾随空格就消失了。

    现在,使用这个正则表达式来拆分电子邮件:

     String.split("[,;]+\\s*")
    

    我认为应该这样做。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多