我有以下与字符串匹配的正则表达式:
(?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
转化为正面观察?
答案 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}$]
等字符类中,它们将被解析为文字插入符号和美元符号。