gpt4 book ai didi

java 正则表达式测验

转载 作者:行者123 更新时间:2023-12-02 10:47:22 24 4
gpt4 key购买 nike

理解正则表达式世界真的很难。

任何人都可以解释一下正则表达式如何产生结果,

如果 n 为 1,结果将为 23020,n 为 2 -> 33,n 为 3 -> 2103, 4 -> 32

    public static void main(String[] args) {
String s = "some023020 num ber 033 02103 32 meh peh beh 4328";
}

static String nthNumber(String s, int n) {
Pattern pattern = Pattern.compile(
"\\D*(?:\\d+\\D+){" + (n-1) + "}0*(\\d+).*");

Matcher matcher = pattern.matcher(s);
matcher.matches();
return matcher.group(1);
}

最佳答案

考虑 n = 1。那么你的模式就变成:

\D*(?:\d+\D+){0}0*(\d+).*

首先,您需要了解 matcher.group() 中的组编号表示什么。第 0 组包含与完整模式匹配的子字符串。

在您的情况下,这是整个字符串。为什么?

\D* - 匹配零个或多个 [^0-9],即除 0-9 之外的所有字符。因此它将匹配前 4 个字母 "some"

(?:\d+\D+){0} - 匹配 [0-9] 中的一个或多个以及 [^0-9] 中的一个或多个。开头的?:称为非捕获组。这基本上意味着不要将其视为一个群体。 {0} 表示 (?:\d+\D+){0} 应匹配多少次。现在它是 0,所以什么都不匹配。

0* - 匹配一个或多个 0。因此这与 "some" 之后的 "0" 匹配。所以到目前为止我们已经匹配了some0

(\d+) - 匹配 [0-9] 中的一个或多个。这与“23020”匹配。观察\d+ 是如何在 () 内部的,并且它的开头没有 ?: 。这意味着这将是我们的组 1。(这就是为什么 n=1 的 matcher.group(1) 返回 23020)。

.* - 匹配零个或多个任意字符。所以这会匹配到字符串末尾。

这就是组 0 包含完整字符串的原因。

现在移至第 1 组。

在我们的例子中,第 1 组是 (\d+) - 包含一个或多个 [0-9] 的子字符串。但事实并非如此。 该子字符串之前的字符串部分也应与模式 \D*(?:\d+\D+){0}0* 匹配。这非常重要。

让我们快速分析一下您的字符串。

\D* - 匹配“some”

(?:\d+\D+){0} - 匹配零次出现(因为 {0})。所以什么都不匹配。

0* - 匹配“0”。所以我们匹配了“some0”

(\d+) - 匹配 23020

这回答了您问题的第一部分:当 n=1 时,为什么结果是 23020

在我们继续之前,请注意空格也是一个与\D 匹配的字符。这听起来微不足道,但经常被忽视。

现在,当 n=2 时,您的模式变为:

\D*(?:\d+\D+){1}0*(\d+).*

让我们快速分析一下:

\D* - 匹配“some”

(?:\d+\D+){1} - 这次,我们需要精确匹配 (?:\d+\D+) 的一次出现。所以这将是“023020号码”

0* - 匹配 0。因此我们已匹配到“some023020 number 0”

(\d+) - 匹配 33(由于空格而不是 33 02103 32)。

因此,当 n=2 时,matcher.group(1) 返回 33。

可以用同样的方法分析n=3,4。

希望这有帮助!当你迷路时(不一定是在正则表达式中)最好的办法是查看官方文档。完整地阅读它,而不仅仅是浏览备忘单。这样您就可以更好地理解。

关于java 正则表达式测验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52453175/

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