我在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时,是否存在输出?
答案 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+
作为正则表达式。