【问题标题】:Use String.split() with multiple delimiters使用带有多个分隔符的 String.split()
【发布时间】:2011-08-25 00:38:01
【问题描述】:

我需要根据分隔符 -. 拆分字符串。以下是我想要的输出。

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

但我的以下代码不起作用。

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

【问题讨论】:

  • 根据您所说的,它看起来工作正常。你想要的输出是什么?
  • @Jeff:他展示了他想要的输出(AA / BB / CC ...)
  • 你确定吗?我将其解释为他当前的输出,而不是他想要的输出。也许是时候站起来走一走。
  • @Jeff: 很抱歉造成混乱,我更新了我的帖子以消除您的误解。
  • 正则表达式会降低您的性能。我建议编写一个方法,如果需要,它将逐个字符地分割字符串。您可以进一步优化以获得 log(n) 性能。

标签: java regex


【解决方案1】:

我认为您需要包含正则表达式 OR 运算符

String[]tokens = pdfName.split("-|\\.");

你所拥有的将匹配:
[DASH 跟 DOT 一起]-.
不是
[DASH 或 DOT 中的任何一个]-.

【讨论】:

  • 为什么我们需要两个反斜杠??
  • 正则表达式中的. 字符表示除换行符以外的任何字符。 tutorialspoint.com/java/java_regular_expressions.htm 然而,在这种情况下,他们想要实际的字符 .。两个反斜杠表示您指的是.。反斜杠是转义字符。
  • 正常情况下是.split("match1|match2"),(例如split("https|http")),\\是在上述情况下转义特殊字符.
  • 或者一般情况下,您可以使用pdfName.split("\\W"); 如下@Peter Knego 回答
  • 使用[-.] 而不是-|\\.
【解决方案2】:

试试这个正则表达式"[-.]+"。 + 之后将连续的分隔符视为一个。如果您不想这样做,请删除加号。

【讨论】:

  • @Lurkers:Peter 不必逃避- 的唯一原因是它是[] 内部的第一个 想法,否则就需要在它前面加一个反斜杠(当然,要在它前面放一个反斜杠,我们需要 两个 因为这是一个字符串文字)。
  • 我认为这个答案比公认的更好,因为当您使用逻辑运算符 | 时,问题是您的分隔符之一可能是您的结果“标记”的一部分。 Peter Knego 的 [-.]+ 不会发生这种情况
【解决方案3】:

您可以使用正则表达式“\W”。这匹配任何非单词字符。所需的行是:

String[] tokens=pdfName.split("\\W");

【讨论】:

  • 它对我不起作用` String s = "id(INT), name(STRING),"。在这里使用 \\W 创建一个长度为 6 的数组,而它应该只有 4
  • 当输入包含 Unicode 字符时,这也会中断。最好只包含实际的分隔符,而不是使用 \W 的“全部”。
【解决方案4】:

使用Guava 你可以这样做:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

【讨论】:

    【解决方案5】:

    你给split的字符串是正则表达式的字符串形式,所以:

    private void getId(String pdfName){
        String[]tokens = pdfName.split("[\\-.]");
    }
    

    这意味着拆分[] 中的任何字符(我们必须用反斜杠转义-,因为它在[] 中是特殊的;当然我们必须转义反斜杠,因为这是一个字符串)。 (相反,. 通常是特殊的,但在[]并不特殊。)

    【讨论】:

    • 在这种情况下您不需要转义连字符,因为[-.] 不可能被解释为范围。
    • @Alan:因为这是课堂上的第一件事,这是非常正确的。但是我总是这样,以后回去不假思索地在前面加点东西太容易了。逃脱它不需要任何代价,所以......
    • 你知道如何转义括号吗?我有字符串“[200] Engineering”,我想将其拆分为“200”、“Engineering”
    • 哦,哇,我明白了...我不得不使用两个反斜杠而不是一个。 String[] strings = codes.get(x).split("\\[|\\]| ");
    【解决方案6】:

    对于作为分隔符“AND”和“OR”的两个字符序列,这应该有效。使用时不要忘记修剪。

     String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
     String[] cities = text.split("AND|OR"); 
    

    结果:城市 = {“伊斯坦布尔”、“纽约”、“巴黎”、“东京”、“莫斯科”}

    【讨论】:

    • 我怎样才能得到像 {"ISTANBUL AND"、" NEW YORK AND"、" PARIS OR"、" TOKYO AND"、" MOSCOW"}这样的输出}
    【解决方案7】:

    我会使用 Apache Commons:

    导入org.apache.commons.lang3.StringUtils;

    private void getId(String pdfName){
        String[] tokens = StringUtils.split(pdfName, "-.");
    }
    

    它将在任何指定的分隔符上进行拆分,而不是 StringUtils.splitByWholeSeparator(str, separator) 使用完整的字符串作为分隔符

    【讨论】:

      【解决方案8】:
      String[] token=s.split("[.-]");
      

      【讨论】:

      • 请帮助消除对 StackOverflow 是免费代码编写服务的误解,通过一些解释来增加您的纯代码答案。
      【解决方案9】:

      pdfName.split("[.-]+");

      • [.-] -> .- 中的任何一个都可以用作分隔符

      • +符号表示如果上述分隔符连续出现,我们应该将其视为一个。

      【讨论】:

        【解决方案10】:

        最好使用这样的东西:

        s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");
        

        添加了一些其他字符作为示例。这是最安全的使用方式,因为.'的处理方式。

        【讨论】:

          【解决方案11】:

          你也可以在 split() 方法中指定正则表达式作为参数..见下面的例子....

          private void getId(String pdfName){
          String[]tokens = pdfName.split("-|\\.");
          }
          

          【讨论】:

            【解决方案12】:

            试试这个代码:

            var string = 'AA.BB-CC-DD.zip';
            array = string.split(/[,.]/);
            

            【讨论】:

            • 请帮助消除对 StackOverflow 是免费代码编写服务的误解,通过一些解释来增加您的纯代码答案。
            【解决方案13】:
            s.trim().split("[\\W]+") 
            

            应该可以。

            【讨论】:

            • 首先,不,它不起作用-也许您可以在发布之前尝试一下?然后this answer 与您的相同 - 但可以正常工作。最后你应该检查你的格式(应该可以工作。)。
            • 请帮助消除对 StackOverflow 是免费代码编写服务的误解,通过一些解释来增加您的纯代码答案。
            【解决方案14】:

            如果您知道字符串将始终采用相同的格式,请首先根据. 拆分字符串并将字符串存储在变量中的第一个索引处。然后根据-拆分第二个索引中的字符串并存储索引0、1和2。最后根据.拆分前一个数组的索引2,你应该已经获得了所有相关字段。

            参考下面的sn-p:

            String[] tmp = pdfName.split(".");
            String val1 = tmp[0];
            tmp = tmp[1].split("-");
            String val2 = tmp[0];
            ...
            

            【讨论】:

            • 一步到位,所以一步到位。查看其他回复。
            • pdfName.split(".") 生成长度为零的数组。
            • 1) . 需要转义为\\.
            猜你喜欢
            • 2010-10-02
            • 1970-01-01
            • 2011-11-21
            • 1970-01-01
            • 1970-01-01
            • 2018-05-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多