我将此(.*)([USB][\s])*
作为正则表达式的一部分。当我尝试将其与ABHISHEK USB
匹配时,它匹配但是与第一部分匹配的值。有什么方法可以忽略USB
中的(.*)
部分,并将其与([USB][\s])
匹配。
答案 0 :(得分:1)
星号(*
)表示重复零或更多次。这是贪婪地完成的。因此,问题是.*
会尝试匹配所有内容,并且由于第二个星可以匹配零字符,因此不会执行回溯。两种解决方案:
如果您确定,(\sUSB)*
部分会出现,请使用+
代替*
重复一次或更多次:< / p>
(.*)(\sUSB)+
如果不是这样,请对第一颗星使用非贪婪重复 - .*?
:
(.*?)(\sUSB)*
答案 1 :(得分:0)
答案 2 :(得分:0)
我猜你正在寻找这个:
(.*?)\s*USB\s*
请注意,我已将您的[USB]
更改为USB
因为[USB]
匹配U or S or B
而不是字符串USB
此外,我使用.*
将?
更改为非贪婪的。
答案 3 :(得分:0)
你的正则表达式中有一个贪婪的量词。 查看Java教程Differences Among Greedy, Reluctant, and Possessive Quantifiers
public class Test {
@org.junit.Test
public void testRegx() {
String s = "(.*?)(USB)(.*)";
String value = "ABHISHEK USB \\t";
Matcher m = Pattern.compile(s).matcher(value);
if(m.matches()) {
Assert.assertEquals("ABHISHEK ", m.group(1));
Assert.assertEquals("USB", m.group(2));
Assert.assertEquals(" \\t", m.group(3));
} else {
Assert.assertFalse(true);
}
}
}