java 正则表达式 边界_Java正则表达式边界匹配?

本文探讨了Java中使用正则表达式`[wow]*`匹配字符串时出现的意外结果。当模式允许空匹配时,引擎会在每个字符后面尝试匹配,包括在字符串末尾,导致空字符串的匹配。这种情况在`wowitscool`字符串的最后一个字符`l`之后产生了一个空匹配。解释了这种行为是由正则表达式的贪婪匹配特性和字符串的尾部处理引起的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在一个Java测试套件中发现了以下问题

Pattern p = Pattern.compile("[wow]*");

Matcher m = p.matcher("wow its cool");

boolean b = false;

while (b = m.find()) {

System.out.print(m.start() + " \"" + m.group() + "\" ");

}

输出似乎如下

0 "wow" 3 "" 4 "" 5 "" 6 "" 7 "" 8 "" 9 "oo" 11 "" 12 ""

直到最后一场比赛很明显,模式[哇] *贪婪地匹配0或更多’w’和’o’字符,而对于不匹配的字符,包括空格,它会产生空字符串.然而,在将最后一个’l’与11“”匹配后,以下12“”似乎不清楚.在测试解决方案中没有详细说明,我也无法从javadoc中明确地解决这个问题.我最好的猜测是边界特征,但如果有人能提供解释,我将不胜感激

解决方法:

您看到此行为的原因是您的模式允许空匹配.换句话说,如果你传递一个空字符串,你会在零位置看到一个匹配:

Pattern p = Pattern.compile("[wow]*"); // One of the two 'w's is redundant, but the engine is OK with it

Matcher m = p.matcher(""); // Passing an empty string results in a valid match that is empty

boolean b = false;

while (b = m.find()) {

System.out.print(m.start() + " \"" + m.group() + "\" ");

}

这将打印0“”,因为空字符串与表达式的任何其他匹配一样好.

再回到你的例子,每当引擎发现一个匹配项(包括一个空的匹配项)时,它会通过一个字符前进. “前进一个”意味着引擎在下一个位置考虑弦的“尾部”.这包括正则表达式引擎处于位置11的时间,即最后一个字符的时间:这里,“尾部”由空字符串组成.这类似于调用“wow its cool”.substring(12):在这种情况下你也会得到一个空字符串.

引擎将空字符串视为有效输入,并尝试将其与表达式匹配,如上例所示.这会产生匹配,您的程序会正确报告.

标签:java,regex,string

来源: https://codeday.me/bug/20190528/1171866.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值