我一直试图修复一个简单的正则表达式:
^
)到第一个&
字符或到行尾($
)的所有字符。 &
开头。 示例:
test
应与test
匹配。 one&two
应与one
匹配。 &test
不应该匹配任何内容。 我目前的正则表达式如下:
^(?<!\&)(.+?)(?=\&|$)
(Regex101)
目前,这个正则表达式失败了示例3,如果我给这个正则表达式&test
它匹配&test
,但它不应该匹配任何东西。
我认为这可能是负面的后顾问(?<!\&)
和&test
匹配的问题,因为它之前的字符不是&
,但它并不代表任何以下&
个字符。
修改负面的lookbehind以解释可能重复&
个字符的问题,如果是这样,我怎么能修复这个正则表达式呢?
(我知道Regex101正在使用Python的正则表达式,但这个问题的正则表达式适用于Java。)
答案 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