Java Regex:如何忽略一组单词

时间:2015-09-14 11:59:20

标签: java regex regex-negation

我将此(.*)([USB][\s])*作为正则表达式的一部分。当我尝试将其与ABHISHEK USB匹配时,它匹配但是与第一部分匹配的值。有什么方法可以忽略USB中的(.*)部分,并将其与([USB][\s])匹配。

4 个答案:

答案 0 :(得分:1)

星号(*)表示重复或更多次。这是贪婪地完成的。因此,问题是.*会尝试匹配所有内容,并且由于第二个星可以匹配字符,因此不会执行回溯。两种解决方案:

  1. 如果您确定,(\sUSB)*部分会出现,请使用+代替*重复一次或更多次:< / p>

    (.*)(\sUSB)+
    
  2. 如果不是这样,请对第一颗星使用非贪婪重复 - .*?

    (.*?)(\sUSB)*
    

答案 1 :(得分:0)

试试这个正则表达式:

(.*)(?=USB[\s]*)

https://regex101.com/r/bG8vB4/1

答案 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);
        }

      }
}