【问题标题】:Splitting a string between a char在字符之间拆分字符串
【发布时间】:2015-05-18 12:38:02
【问题描述】:

我想在分隔符上拆分字符串。 示例字符串:

String str="ABCD/12346567899887455422DEFG/15479897445698742322141PQRS/141455798951";

现在我想要字符串为ABCD/12346567899887455422DEFG/15479897445698742322141,就像我想要的那样

  • / 前仅 4 个字符
  • 在 / 任意数量的字符数字和字母之后。 更新: 我需要前 4 个字符的唯一时间是在显示分隔符之后,因为字符串可能包含字母或数字...

我的代码尝试:

public class StringReq {

    public static void main(String[] args) {
        String str = "BONL/1234567890123456789CORT/123456789012345678901234567890HOLD/123456789012345678901234567890INTC/123456789012345678901234567890OTHR/123456789012345678901234567890PHOB/123456789012345678901234567890PHON/123456789012345678901234567890REPA/123456789012345678901234567890SDVA/123456789012345678901234567890TELI/123456789012345678901234567890";
        testSplitStrings(str);


    }

    public static void testSplitStrings(String path) {
        System.out.println("splitting of sprint starts \n");
        String[] codeDesc = path.split("/");
        String[] codeVal = new String[codeDesc.length];
        for (int i = 0; i < codeDesc.length; i++) {
            codeVal[i] = codeDesc[i].substring(codeDesc[i].length() - 4,
                    codeDesc[i].length());

            System.out.println("line" + i + "==> " + codeDesc[i] + "\n");
        }

        for (int i = 0; i < codeVal.length - 1; i++) {
            System.out.println(codeVal[i]);
        }
        System.out.println("splitting of sprint ends");
    }

}

【问题讨论】:

  • 在我看来你想要进行正则表达式匹配,而不是拆分。

标签: java string split


【解决方案1】:

您声称在/ 之后可以出现数字和字母,但在您的示例中,我没有看到任何字母应该包含在/ 之后的结果中。

因此,基于该假设,您可以简单地将其拆分为前面有数字和后面有 A-Z 字符的位置。

为此,您可以使用正则表达式 split,该正则表达式使用 look-around 机制,如 str.split("(?&lt;=[0-9])(?=[A-Z])")

演示:

String str = "BONL/1234567890123456789CORT/123456789012345678901234567890HOLD/123456789012345678901234567890INTC/123456789012345678901234567890OTHR/123456789012345678901234567890PHOB/123456789012345678901234567890PHON/123456789012345678901234567890REPA/123456789012345678901234567890SDVA/123456789012345678901234567890TELI/123456789012345678901234567890";
for (String s : str.split("(?<=[0-9])(?=[A-Z])"))
    System.out.println(s);

输出:

BONL/1234567890123456789
CORT/123456789012345678901234567890
HOLD/123456789012345678901234567890
INTC/123456789012345678901234567890
OTHR/123456789012345678901234567890
PHOB/123456789012345678901234567890
PHON/123456789012345678901234567890
REPA/123456789012345678901234567890
SDVA/123456789012345678901234567890
TELI/123456789012345678901234567890

如果您的字母实际上可以出现在第二部分(/ 之后),那么您可以使用 split 来尝试查找具有四个字母字符和 / 之后的位置,例如 split("(?=[A-Z]{4}/)")(假设您正在使用至少 Java 8,如果不是,您需要手动排除在字符串开头拆分的情况,例如在您的正则表达式开头添加 (?!^)(?&lt;=.)

【讨论】:

  • TEST/123ABCDATA/123这样的输入怎么样?应该是有效的并导致TEST/123ABCDATA/123 我可以从问题中看到。
  • 我也想知道这样的案例,因为 OP 声称“在/任意数量的字符甚至数字和字母之后”但看起来 OP 实际上是在第二次使用部分只有数字,所以我的回答是基于字母实际上不属于/出现在第二部分的假设。将更新我的答案以反映这一点。
  • 我同意示例数据没有反映这一事实,但规范确实如此。以下正则表达式应该是正确的,(?&lt;=.)(?=[A-Z]{4}/)
  • @RogerGustavsson 是的,我已经为我的答案添加了非常相似的解决方案。顺便说一句,自 Java 8 以来,我们不需要担心 (?&lt;=.) 部分,因为如果在字符串的开头找到分隔符,零长度正则表达式(如环视)上的 split 将不会在开头产生空字符串。您可以在我发布的问题中找到更多信息:stackoverflow.com/questions/22718744/…
【解决方案2】:

你可以使用正则表达式

    Pattern pattern = Pattern.compile("[A-Z]{4}/[0-9]*");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
      System.out.println(matcher.group());
    }

【讨论】:

    【解决方案3】:

    代替:

    String[] codeDesc = path.split("/");
    

    只需使用此正则表达式(/ 之前的 4 个字符和之后的任何字符):

    String[] codeDesc = path.split("(?=.{4}/)(?<=.)");
    

    【讨论】:

      【解决方案4】:

      使用\d 更简单:

      path.split("(?=[A-Za-z])(?&lt;=\\d)");

      编辑:

      仅适用于 4 个任意大小的字母。

      path.split("(?=[A-Za-z]{4})(?&lt;=\\d)");

      输出:

      BONL/1234567890123456789
      CORT/123456789012345678901234567890
      HOLD/123456789012345678901234567890
      INTC/123456789012345678901234567890
      OTHR/123456789012345678901234567890
      PHOB/123456789012345678901234567890
      PHON/123456789012345678901234567890
      REPA/123456789012345678901234567890
      SDVA/123456789012345678901234567890
      TELI/123456789012345678901234567890
      

      目前尚不清楚这是否是作者的预期结果。

      【讨论】:

      • 数字字符可以与字母字符混合使用。有效输入序列:TEST/123ABCTEST/123CDE。应该是TEST/123ABCTEST/123CDE。所以你的答案是行不通的。
      • Roger Gustavsson 好的,你有权使用字符数。作者在帖子中提到了这一点,但仍不清楚预期的结果以及预期的行为。我为这个解决方案添加了 4 个字母的条件加上小写字母的条件——我们不应该限制它们。你没有充分的理由拒绝我的回答。你为什么这样做?这是得分最高的反应的另一个版本。另一件事是您的解决方案也是错误的。您的建议中没有考虑小写字符,因此根据此政策也应该投反对票。
      • 很抱歉投了反对票。太快了。在您编辑答案之前,我无法撤消它。
      猜你喜欢
      • 2012-12-14
      • 2023-04-09
      • 1970-01-01
      • 2015-08-29
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      相关资源
      最近更新 更多