【问题标题】:Pattern/Matcher vs String.split() for the same regex相同正则表达式的模式/匹配器与 String.split()
【发布时间】:2015-03-04 07:14:57
【问题描述】:

为什么 Pattern/Matcher 可以使用 (\\d+)([a-zA-Z]+)String.split() 不行?

例如:

String line = "1A2B";

Pattern p = Pattern.compile("(\\d+)([a-zA-Z]+)");
Matcher m = p.matcher(line);
System.out.println(m.groupCount());

while(m.find())
{
    System.out.println(m.group());
}

打印:

2
1A
2B

但是:

    String line = "1A2B";
    String [] arrayOfStrings = line.split("(\\d+)([a-zA-Z]+)");
    System.out.println(arrayOfStrings.length);

    for(String elem: arrayOfStrings){
        System.out.println(elem);
    }

仅打印:

0

【问题讨论】:

  • split 的正则表达式是一个分隔符,而在 matcher 的情况下它是一个“模式”,用于匹配您选择的表达式...
  • 你想根据什么来分割?
  • 只是分成(数字+字母)的组。但是为什么我不能使用与 String.split() 相同的正则表达式?

标签: java regex


【解决方案1】:

那是因为.split(String regex) 使用正则表达式来标记在哪里中断字符串。因此,在您的情况下,如果您有 1A2B£$%^&,它将打印 1 个字符串:£$%^&,因为它将在 1A 处拆分,然后在 2B 处拆分,但是,由于这些返回空组,因此它们将被省略并且您只剩下£$%^&

另一方面,正则表达式的作用是匹配字符串并将它们分组。然后可以在稍后阶段访问这些组。

【讨论】:

    【解决方案2】:

    为什么它不起作用

    因为 spit 会消耗这些字符,并且输出列表中没有剩余字符

    解决方案

    不完美,但展望未来会帮助你

    String line = "1A2B";
    String [] arrayOfStrings = line.split("(?=\\d+[a-zA-Z]+)");
    System.out.println(arrayOfStrings.length);
    
    for(String elem: arrayOfStrings){
        System.out.println(elem);
    

    将输出为

    3
    
    1A
    2B
    

    不完美,因为在字符串的开头向前看将是正确的,因此在索引 0 处的输出列表中创建一个空字符串。在示例中,您可以看到长度为 3,而我们期望为 2

    【讨论】:

    • 糟糕,对不起。谢谢:)
    猜你喜欢
    • 2013-11-25
    • 2016-04-20
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多