【问题标题】:How do I split or tokenize a string only when 2 delimiters are present together (adjacent to each other)仅当 2 个分隔符一起存在(彼此相邻)时,如何拆分或标记字符串
【发布时间】:2019-05-03 04:43:40
【问题描述】:

我正在逐行阅读,当分隔符;(分号+空格)存在时,我需要拆分每一行。每行如下:s1; s2s3; s4。我想在;(分号+空格)存在的地方分割这条线。我只想在分号和空格相邻的地方拆分,空格跟在分号后面。

我将如何使用 StringTokenizer 来做到这一点?

我已经尝试过 split("; ") 但这会在每次出现空格时拆分字符串。

我也尝试过 new StringTokenizer(strLine,"\s*;\s+"),但每次出现 's' 时都会分裂。

String[] parsedStr = inputString.split(...);

StringTokenizer st = new StringTokenizer(...);

我希望输出是:

("s1","s2 s3","s4") Every token should be an element within this array.

不是

("s1"," s2 s3"," s4") 

也没有

("s1","s2","s3","s4")

【问题讨论】:

  • 只使用StringTokenizer
  • 你确定吗?根据我的经验,inputString.split("; ") 效果很好。
  • 使用 StringTokenizer 给了我同样的问题。
  • 请发布一个最小但完整的程序。我的猜测是该错误不在String.split 调用中,而是在其他地方。

标签: java split delimiter stringtokenizer


【解决方案1】:

您可以将正则表达式与"\\s*;\\s+" 结合使用。它将删除任何初始或尾随空格。还需要';'后跟至少 1 个空格。

        String inputString = "s1; s2 s3; s4;s5";
        String[] parsedStr = inputString.split("\\s*;\\s+");

        System.out.print(Arrays.asList(parsedStr)); // ["s1", "s2 s3", "s4;s5"]

编辑:

如果你需要用分号分割,精确一个空格,其他空格保留,你可以将上面的解决方案修改如下:

        String inputString = "s1; s2 s3; s4;s5; s6;  s7;";
        String[] parsedStr = inputString.split(";\\s{1}");

        System.out.print(Arrays.asList(parsedStr)); // ["s1", "s2 s3", "s4;s5", "s6", " s7;"]

【讨论】:

  • 我尝试了代码,但将“s4”和“s5”作为两个字符串,而不是“s4;s5”
  • 对不起,我修好了。您需要 \\s+(至少一个空格)而不是 \\s*(0 或多个)在 ';' 之后
  • 是的,现在显示“s4;s5”。但是如果输入是“s1;s2 s3;s4;s5”;(s2前面的两个空格),那么就会出现其他问题。也许这不是解决问题的好方向:-)
  • 不,我的意思是当“s2 s3”前面有两个空格时,结果应该是“s2 s3”(s2前面有一个空格)。但 \\s* 会删除所有空格。
  • 那么您应该指定尾随空格的确切数量,例如“;\\s{1}”。我会更新我的答案。
【解决方案2】:

根据您之前的问题,解决方案如下:

   public class Split {
    public static void main(String[] args) {
        String inputString = "s1; s2 s3; s4;s5";
        String[] parsedStr = inputString.split("; | |;");
        System.out.print(Arrays.asList(parsedStr));
    } }

由于您已经编辑了问题陈述,因此解决方案将很简单:

inputString.split("; ");

【讨论】:

  • 这仍然会在每次出现空格时拆分。
【解决方案3】:
public static void main(String [] args){
 java.util.Scanner input=new java.util.Scanner
                        ("s1; s2 s3; s4").useDelimiter("\\s*; \\s*");

       while(input.hasNext())
       {
       System.out.print(input.next()+",");
       }
  input.close();
}

【讨论】:

  • 这段代码也将在分号没有尾随空格分割。
  • 我得到了那部分,但在预期的输出中有一个空格 btw s2 和 s3
  • 是的,这是一个示例,并且规范多次说明:分隔符完全是分号空格。
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2017-08-11
  • 2018-09-10
相关资源
最近更新 更多