【发布时间】:2017-08-12 03:05:32
【问题描述】:
我有以下将字符串与模式匹配的正则表达式:
(?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 转换为正向查找?
【问题讨论】:
-
(?=[\\s\\p{Punct}])与(?![^\\s\\p{Punct}])不同 -
两个负数就是一个正数。但是,如果使用否定字符类来排除超类的子类,则需要小心。示例
[^\P{Punct},.]另外,请注意,使用两个底片具有传递锚点的隐藏优势。所以空白边界是(?<!\S)和(?!\S)
标签: java regex string pattern-matching