gpt4 book ai didi

字符串拆分中的 Java 正则表达式量词

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:07:55 26 4
gpt4 key购买 nike

代码:

String s = "a12ij";

System.out.println(Arrays.toString(s.split("\\d?")));

输出是 [a, , , i, j],这让我很困惑。如果表达式是贪心的,它不应该尽可能多地尝试匹配,从而在每个数字上进行拆分吗?我假设输出应该是 [a, , i, j] 。那个多余的空字符是从哪里来的?

最佳答案

您使用的模式一次只匹配一个数字:

\d    match a digit [0-9]
? matches between zero and one time (greedy)

由于您有多个数字,因此将分别拆分为两个数字。您可以通过多种不同的方式轻松地一次匹配多个数字,这里有一些:

\d    match a digit [0-9]
+? matches between one and unlimited times (lazy)

或者你可以这样做:

\d    match a digit [0-9]
+ matches between one and unlimited times (greedy)

这可能最接近我认为您想要的,尽管还不清楚。

解释:

由于 token \d 使用 ? 量词,正则表达式引擎告诉您的拆分函数匹配零到一次之间的数字。因此,这必须包括您的所有字符(零),以及匹配的每个数字(一次)。

你可以把它想象成这样:

    a,1,2,i,j    // each character represents (zero) and is split
| |
a, , ,i,j // digit 1 and 2 are each matched (once)

数字 1 和 2 匹配但未被捕获——因此它们被丢弃,但是,逗号仍然保留在拆分中,并且没有被删除,基本上产生两个空字符串。


如果您特别希望得到 a, ,i,j 的结果,那么我会给您一个提示。您需要 (\digits 捕获为一组介于一次和无限次之间+),然后是贪婪限定符 ?。我建议访问一个流行的正则表达式站点,它允许您试验模式和量词;这也是一种很好的学习方式,可以教给您很多东西!

The solution can be found here

关于字符串拆分中的 Java 正则表达式量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36672686/

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