正则表达式:是否有可能跳过重复的负面观察?

时间:2015-10-15 11:46:41

标签: java regex

我一直试图修复一个简单的正则表达式:

  1. 匹配从行首(^)到第一个&字符到行尾($)的所有字符。
  2. 匹配不能以&开头。
  3. 示例:

    1. test应与test匹配。
    2. one&two应与one匹配。
    3. &test不应该匹配任何内容。
    4. 我目前的正则表达式如下:

      ^(?<!\&)(.+?)(?=\&|$)
      

      Regex101

      目前,这个正则表达式失败了示例3,如果我给这个正则表达式&test它匹配&test,但它不应该匹配任何东西。

      我认为这可能是负面的后顾问(?<!\&)&test匹配的问题,因为它之前的字符不是&,但它并不代表任何以下&个字符。

      修改负面的lookbehind以解释可能重复&个字符的问题,如果是这样,我怎么能修复这个正则表达式呢?

      (我知道Regex101正在使用Python的正则表达式,但这个问题的正则表达式适用于Java。)

1 个答案:

答案 0 :(得分:3)

你需要使用前瞻而不是后视,而不是使用前瞻的懒惰点匹配,使用否定的字符类:

^[^&]+

请参阅demo(请注意,\n仅针对演示添加,如果您测试的字符串没有换行符,则无需使用。)

此处,^断言字符串开头的位置,[^&]+类匹配&以外的1个或多个字符(因此,无需使用(?=\&|$)前瞻,如果需要,整行将匹配)。

请参阅IDEONE demo

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(fetchMatch("test", 0));
    System.out.println(fetchMatch("one&test", 0));
    System.out.println(fetchMatch("&test", 0));
}
public static String fetchMatch(String s, int groupId)
{
    Pattern pattern = Pattern.compile("^[^&]+");
    Matcher matcher = pattern.matcher(s);
    if (matcher.find()){
        return matcher.group(groupId); 
    } 
    return "ERROR: NOT MATCHED";
}

输出:

test
one
ERROR: NOT MATCHED