【问题标题】:Java Regex : How to ignore a set of wordsJava Regex:如何忽略一组单词
【发布时间】:2015-09-14 11:59:19
【问题描述】:
我有这个(.*)([USB][\s])* 作为正则表达式的一部分。当我尝试将其与ABHISHEK USB 匹配时,它匹配但完整值与第一部分匹配。有什么方法可以让我忽略(.*) 中的USB 部分并使其与([USB][\s]) 匹配。
【问题讨论】:
-
-
这似乎是一个非常具体的案例。 (.*?)(\s*USB)*$ 呢?注意这里,USB 应该在字符串的末尾。如果它不满足您的需要,请在问题中添加更多规范。另请注意,[USB] 匹配 1 个字符,U 或 S 或 B。如果您也需要将ABHISHEK 与正则表达式匹配,请告知。
标签:
java
regex
regex-negation
【解决方案1】:
星号 (*) 表示重复 零 次或多次。这是贪婪地完成的。因此,问题在于.* 会尝试匹配所有内容,并且由于第二颗星可以匹配零 个字符,因此不会执行回溯。两种解决方案:
-
如果您确定,(\sUSB)* 部分将出现,请使用 + 而不是 * 重复 一次 或多次:
(.*)(\sUSB)+
-
如果不是这样,对第一颗星使用非贪婪重复 - .*?:
(.*?)(\sUSB)*
【解决方案3】:
我猜你正在寻找这个:
(.*?)\s*USB\s*
请注意,我将您的 [USB] 更改为 USB
因为[USB] 匹配U or S or B 而不是字符串USB
我还将.* 更改为非贪婪的?。
【解决方案4】:
您的正则表达式中有一个贪婪的量词。
查看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);
}
}
}