编辑:虽然我已使用java
标记标记了此问题,但我不想要一个需要java代码的解决方案。我希望该模式尽可能与Java的正则表达式实现兼容(遗憾的是,它与PCRE不兼容)。我想要的只是一个产生我想要的匹配的正则表达式。
假设我有这个字符串:
foo bar foo bar # foo bar foo bar
我希望匹配" foo"的实例,但前提是它们不在任何"#"之后。符号(如果存在)。换句话说,我想要这个结果:
foo bar foo bar # foo bar foo bar
^^^ ^^^
我尝试使用这样的负面观察:
(?<!#.*)\bfoo\b
...但这不起作用,因为后视不能长度可变。有什么建议吗?
答案 0 :(得分:0)
这个应该做的工作
(?=。*#)前瞻并获取“#”之前的所有文字
全局标志“g”重复模式
/(?=.*#)(\bfoo\b)/g
答案 1 :(得分:0)
您可以执行replaceFirst
方法删除#
后的文字,然后进行简单的单词匹配:
final Pattern pattern = Pattern.compile("\\bfoo\\b");
final Matcher matcher = pattern.matcher(input.replaceFirst("#.*$", ""));
while (matcher.find()) {
System.err.printf("Found Match: %s%n", matcher.group());
}
答案 2 :(得分:0)
使用单个正则表达式,Java正则表达式不够强大。
#
的情况。 #.*|(\bfoo\b)
然后检查是否定义了第一个匹配组将是一种解决方法,但是没有纯粹的方法来匹配\bfoo\b
序列。
答案 3 :(得分:0)