Java正则表达式:删除(双)负向前看并向后看

时间:2017-03-20 17:37:12

标签: java regex string pattern-matching

我有以下与字符串匹配的正则表达式:

(?i)(?<![^\\s\\p{Punct}]):向后看

(?![^\\s\\p{Punct}]):展望未来

下面是一个演示我如何使用它的示例:

public static void main(String[] args) {
    String patternStart = "(?i)(?<![^\\s\\p{Punct}])", patternEnd = "(?![^\\s\\p{Punct}])";
    String text = "this is some paragraph";
    System.out.println(Pattern.compile(patternStart + Pattern.quote("some paragraph") + patternEnd).matcher(text).find());
}

返回true,这是预期的结果。但是,由于regex使用双重否定(即负向前/后和^),我认为删除两个否定应返回相同的结果。所以,我尝试了以下内容:

String patternStart = "(?i)(?<=[\\s\\p{Punct}])", patternEnd = "(?=[\\s\\p{Punct}])";

然而,它似乎没有按预期工作。我甚至尝试在(方括号的)末尾添加^和/或$以匹配字符串的开头/结尾,仍然没有运气。

是否可以将这些regexes转化为正面观察?

1 个答案:

答案 0 :(得分:1)

是的,这是有可能的,但它的效率低于你的效率,因为在正面看来你需要使用交替

String patternStart = "(?i)(?<=^|[\\s\\p{Punct}])", patternEnd = "(?=[\\s\\p{Punct}]|$)";
                               ^^                                                   ^^ 

(?<=^|[\\s\\p{Punct}]) lookbehind要求存在字符串开头(^)或|空格或标点符号([\\s\\p{Punct}])。正向前瞻(?=[\\s\\p{Punct}]|$)需要空格或标点符号或字符串结尾。

如果您只是将^$添加到[\\s\\p{Punct}^][\\s\\p{Punct}$]等字符类中,它们将被解析为文字插入符号和美元符号。