【问题标题】: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 个字符,USB。如果您也需要将ABHISHEK 与正则表达式匹配,请告知。

标签: java regex regex-negation


【解决方案1】:

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

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

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

    (.*?)(\sUSB)*
    

【讨论】:

    【解决方案2】:

    试试这个正则表达式:

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

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

    【讨论】:

      【解决方案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);
                }
        
              }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-22
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多