匹配明星而不是点星

时间:2015-10-17 00:51:17

标签: java regex

我需要一个正则字符串模式,该字符串s*将成功,但字符串.*不会成功。我发现这很棘手。我希望[^.]\\*[^\\.]\\*(?<!\\.)\\*能够正常运作,但这些都不会。

有什么想法吗?

@Test
public void testTemp() {
    String regex = "[^.][*]";
    if ("s*".matches(regex)) {
        if (".*".matches(regex)) {
            System.out.println("Success");
        } else {
            // This exception gets thrown.
            throw new RuntimeException("Wrongly matches dot star");
        }
    } else {
        throw new RuntimeException("Does not match star");
    }
}

请不要告诉我我的用例是愚蠢的。我有一个完全合法的用例,有点难以清晰表达。我只想说,我并不困惑。

3 个答案:

答案 0 :(得分:3)

您的代码的问题是它也匹配非点字符。您应该使用negative lookbehind代替:

(?<![.])[*]

Regex101 demo.

Pattern regex = Pattern.compile("(?<![.])[*]");
if (regex.matcher("s*").find()) {
    if (!regex.matcher(".*").find()) {
        System.out.println("Success");
    } else {
        // This exception gets thrown.
        throw new RuntimeException("Wrongly matches dot star");
    }
} else {
    throw new RuntimeException("Does not match star");
}

Java demo.

答案 1 :(得分:2)

您的意思是if (! ".*".matches(regex)) {

答案 2 :(得分:2)

模式是正确的,只是你的第二个if声明错了尝试这个

@Test
public void testTemp() {
    String regex = "[^.][*]";
    if ("s*".matches(regex)) {
        if (!".*".matches(regex)) {
            System.out.println("Success");
        } else {
            // This exception gets thrown.
            throw new RuntimeException("Wrongly matches dot star");
        }
    } else {
        throw new RuntimeException("Does not match star");
    }
}