Java 正则表达式:如何忽略一组单词

Java Regex : How to ignore a set of words

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

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

  1. 如果您确定 (\sUSB)* 部分将会出现,请使用 + 而不是 * 来重复 one 或更多次:

    (.*)(\sUSB)+
    
  2. 如果不是这种情况,对第一个星使用非贪婪重复 - .*?:

    (.*?)(\sUSB)*
    

试试这个正则表达式:

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

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

我猜你正在寻找这个:

(.*?)\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);
        }

      }
}