2

我在 Java 正则表达式中发现了一段令我困惑的代码:

Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" );

要编译的字符串是:

String string1 = "Jane's Birthday is 05-12-75\n" + "Dave's Birthday is 11-04-68\n" + "John's Birthday is 04-28-73\n" + "Joe's Birthday is 12-17-77";

是什么意思

[0-35-9]

为什么有 4 个“\d”而不是 3 个?我假设生日只有 3 个数字。

4

4 回答 4

2

\\d不匹配数字,它匹配数字。区别在于\\d\\d将匹配两个连续的数字。

[0-35-9]将匹配范围内0-3的数字或范围内的数字5-9

实际的结果是,这与月份为 10、11、12、01、02、03、05、06、07、08 或 09 的生日匹配。日期和年份无关紧要,只要它们是两位数。这是一种非常冗长的说法,即“找我任何不是四月的生日(04)”。

于 2013-11-08T04:16:31.720 回答
2

是什么意思[0-35-9]

这意味着您提供了一括在方括号内的字符。它指定将成功匹配给定输入字符串中的单个字符的给定字符。0因此,如果匹配字符在through35through之间,则上述字符将匹配9

为什么有 4 个“\d”而不是 3 个?我假设生日只有 3 个数字。

您的生日字符串部分是Birthday is 05-12-75

\d是一个预定义的字符类,其中\d表示一个数字,并\d\d表示两个连续的数字。因此,对于xx-xx-xx-xx我们要写的日期\\d\\d-\\d\\d-\\d\\d-\\d\\dx假设其中代表一个数字(0-9

于 2013-11-08T04:18:49.197 回答
2

的形式\\d只是匹配一个数字,而不是一个数字。

所以使用的模式\\d\\d将匹配两个连续的数字。

Using\\d\\d-\\d\\d将匹配两个连续的数字,即-字面上的两个连续数字。

让我们来看看你的比赛以及为什么。

Joe's Birthday is 12-17-77
                  ^          match a digit 0 to 9
                   ^         match any character of '0' to '3', '5' to '9'
                    ^        match a '-' literally
                     ^       match a digit 0 to 9
                      ^      match a digit 0 to 9
                       ^     match a '-' literally
                        ^    match a digit 0 to 9
                         ^   match a digit 0 to 9

[0-35-9]部分匹配0to 3, 5to的任何字符9

你的整个正则表达式解释:

J              'J'
.*              any character except \n (0 or more times)
\d              match a digit 0 to 9
 [0-35-9]       any character of: '0' to '3', '5' to '9'
   -            match a '-' literally
  \d            match a digit 0 to 9
  \d            match a digit 0 to 9 
   -            match a '-' literally
  \d            match a digit 0 to 9
  \d            match a digit 0 to 9
于 2013-11-08T08:17:02.840 回答
1

混乱出现在我们感知数字的方式上。在我们的数学眼中,中间部分看起来是一个数字,数字“35”。但实际上,它是两个数字,一个“3”和一个“5”。正如之前深入回答的那样,这实际上是两个范围,从 0 到 3 的数字范围,以及从 5 到 9 的范围,因此从可能匹配的数字中消除了 4。

至于 "\d" 的个数,其实是 5 个而不是 4 个。第一个与数字范围中的单个数字配对以匹配月份(例如,十月是 10,六月是 06,所以都匹配,而四月,即 04,则没有)。接下来的两个“\d”配对为一天。最后两对组成了一年。

于 2015-10-13T19:06:35.817 回答