gpt4 book ai didi

java - 使用正则表达式拆分字符串\w\w*?\w+?

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:37 27 4
gpt4 key购买 nike

我正在学习正则表达式并认为我开始掌握了。但是……

我试图拆分一个字符串,我需要帮助来理解这样一个简单的事情:

String input = "abcde";
System.out.println("[a-z] " + Arrays.toString(input.split("[a-z]")));
System.out.println("\\w " + Arrays.toString(input.split("\\w")));
System.out.println("\\w*? " + Arrays.toString(input.split("\\w*?")));
System.out.println("\\w+? " + Arrays.toString(input.split("\\w+?")));

The output is
[a-z] - []
\w - []
\w*? - [, a, b, c, d, e]
\w+? - []

为什么前两行中的任何一行都不在任何字符上拆分字符串?第三个表达式\w*?,(问号防止贪婪)按我的预期工作,在每个字符上拆分字符串。星号、零个或多个匹配项返回一个空数组。

我已经在 NotePad++ 和程序中尝试了表达式,它显示了 5 个匹配项,如下所示:

Scanner ls = new Scanner(input);
while(ls.hasNext())
System.out.format("%s ", ls.findInLine("\\w");

Output is: a b c d e

这让我很困惑

最佳答案

如果您使用正则表达式拆分字符串,您实际上是在告诉应该在何处剪切该字符串。这必然会切断您与正则表达式匹配的内容。这意味着如果您在 \w 处拆分,那么每个字符都是一个拆分点,并且返回它们之间的子字符串(全部为空)。 Java 自动删除尾随的空字符串,如 the documentation 中所述.

这也解释了为什么惰性匹配 \w*? 会给你每个字符,因为它会匹配任何字符之间(以及之前和之后)的每个位置(零宽度)。剩下的就是字符串本身的字符。

让我们分解一下:

  1. [a-z], \w, \w+?

    你的字符串是

    abcde

    匹配如下:

     a  b  c  d  e
    └─┘└─┘└─┘└─┘└─┘

    这给您留下匹配项之间的子字符串,所有这些都是空的。

    以上三个正则表达式在这方面的行为相同,因为它们都只会匹配一个字符。 \w+? 会这样做,因为它缺少任何其他可能使 +? 尝试匹配的不仅仅是最低限度的约束(毕竟它是惰性的)。

  2. \w*?

      a  b  c  d  e
    └┘ └┘ └┘ └┘ └┘ └┘

    在这种情况下,匹配字符之间,为您留下以下子字符串:

    "", "a", "b", "c", "d", "e", ""

    不过,Java 会丢弃尾随的空值。

关于java - 使用正则表达式拆分字符串\w\w*?\w+?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9760909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com