请证明Regex Java程序中的输出是正确的

时间:2016-09-13 14:27:17

标签: java regex certificate

我在Regex中遇到过一个Java程序。

以下是程序代码:

import java.util.regex.*;

public class Regex_demo01 {

    public static void main(String[] args) {
        boolean b=true;
        Pattern p=Pattern.compile("\\d*");
        Matcher m=p.matcher("ab34ef");

        while(b=m.find())
        {
            System.out.println(b);
            System.out.println(">"+m.start()+"\t"+m.group()+"<");
        }


    }

}

输出:

true
>0  <
true
>1  <
true
>2  34<
true
>4  <
true
>5  <
true
>6  <

怀疑:众所周知,如果find()方法获得匹配并且记住匹配的开始位置,则find()方法返回true。如果find()返回true,则可以调用start()方法来获取匹配的起始位置,并且可以调用group()方法来获取表示匹配的源数据的实际位的字符串。 我的问题是&#34;&gt; 6&lt;&#34;当字符串索引到索引5时,是否存在输出?

3 个答案:

答案 0 :(得分:3)

Anser很简单。 x*匹配任何x偶数0

*替换为+,将其匹配为1个或多个留给它的元素。

答案 1 :(得分:1)

星形量词(*)定义为“零次或多次”。也就是说,您的模式大部分时间都匹配零位数。

你真正想要的可能是加号量词(+),这意味着“一次或多次”。

来源:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

  

为什么索引6处有匹配?

RegEx不以char为基础,而是在单个字符之间。匹配空字符串时,它将在每个字符之前和之后显示。当然,省略重复的发现,因此在第一个char之后和第二个char之前的空字符串将产生一个匹配而不是两个匹配。默认情况下,算法是贪婪的,这意味着它将匹配尽可能多的字符。

考虑这个例子:

输入字符串为1

RegEx是\\d*

在这种情况下,RegEx引擎在第一个字符之前启动,并尝试匹配零,一个或多个数字。因为它很贪婪,所以它在开头找到的空字符串后不会停止。它找到一个没有数字的'1'。这是第一场比赛。然后它在比赛后继续搜索。它找到一个空字符串并匹配它,因为它等于零数字。

对于RegEx,字符串'1'看起来像这样:

"" + "1" + ""

前两个单位(空字符串和“1”)匹配模式,第三个空字符串也匹配。

有关此问题的深入文章:http://www.regular-expressions.info/zerolength.html

答案 2 :(得分:1)

  

我的问题是,当字符串索引到索引>6 <时,5如何出现是输出?

这种行为是由于您的正则表达式\\d*匹配0或更多位数。

正如您所看到的那样,当开头没有数字时,它也会显示起始位置0

同样6 last index +1 ,因为在最后一个字符后面还有空匹配。

您应该使用\\d+作为正则表达式。