Java 正则表达式:如何忽略一组单词
Java Regex : How to ignore a set of words
我将此 (.*)([USB][\s])*
作为正则表达式的一部分。当我尝试将它与 ABHISHEK USB
匹配时,它匹配但完整值与第一部分匹配。有什么方法可以忽略 (.*)
中的 USB
部分并将其匹配到 ([USB][\s])
.
星星 (*
) 表示重复 零 次或更多次。这是贪婪地完成的。因此,问题是 .*
会尝试匹配所有内容,而由于第二颗星可以匹配 0 个字符,因此不会执行回溯。两种解决方案:
如果您确定 (\sUSB)*
部分将会出现,请使用 +
而不是 *
来重复 one 或更多次:
(.*)(\sUSB)+
如果不是这种情况,对第一个星使用非贪婪重复 - .*?
:
(.*?)(\sUSB)*
试试这个正则表达式:
(.*)(?=USB[\s]*)
我猜你正在寻找这个:
(.*?)\s*USB\s*
请注意,我将您的 [USB]
更改为 USB
因为 [USB]
匹配 U or S or B
而不是字符串 USB
另外我把 .*
改成非贪心的, ?
.
您的正则表达式中有贪婪量词。
检查 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);
}
}
}
我将此 (.*)([USB][\s])*
作为正则表达式的一部分。当我尝试将它与 ABHISHEK USB
匹配时,它匹配但完整值与第一部分匹配。有什么方法可以忽略 (.*)
中的 USB
部分并将其匹配到 ([USB][\s])
.
星星 (*
) 表示重复 零 次或更多次。这是贪婪地完成的。因此,问题是 .*
会尝试匹配所有内容,而由于第二颗星可以匹配 0 个字符,因此不会执行回溯。两种解决方案:
如果您确定
(\sUSB)*
部分将会出现,请使用+
而不是*
来重复 one 或更多次:(.*)(\sUSB)+
如果不是这种情况,对第一个星使用非贪婪重复 -
.*?
:(.*?)(\sUSB)*
试试这个正则表达式:
(.*)(?=USB[\s]*)
我猜你正在寻找这个:
(.*?)\s*USB\s*
请注意,我将您的 [USB]
更改为 USB
因为 [USB]
匹配 U or S or B
而不是字符串 USB
另外我把 .*
改成非贪心的, ?
.
您的正则表达式中有贪婪量词。 检查 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);
}
}
}