正则表达式:在"#"

时间:2017-01-05 17:37:25

标签: regex

编辑:虽然我已使用java标记标记了此问题,但我不想要一个需要java代码的解决方案。我希望该模式尽可能与Java的正则表达式实现兼容(遗憾的是,它与PCRE不兼容)。我想要的只是一个产生我想要的匹配的正则表达式。

假设我有这个字符串:

foo bar foo bar # foo bar foo bar

我希望匹配" foo"的实例,但前提是它们不在任何"#"之后。符号(如果存在)。换句话说,我想要这个结果:

foo bar foo bar # foo bar foo bar
^^^     ^^^

我尝试使用这样的负面观察:

(?<!#.*)\bfoo\b

...但这不起作用,因为后视不能长度可变。有什么建议吗?

4 个答案:

答案 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正则表达式不够强大。

  • Lookbehind是固定宽度,所以这不是解决方案。
  • Lookeahead仅适用于您可以确定字符串中有#的情况。
  • Java不允许匹配失败,然后在最后继续搜索(例如在PCRE中使用SKIP / FAIL)。在最后一次匹配开始后,它始终在角色处继续。

#.*|(\bfoo\b)然后检查是否定义了第一个匹配组将是一种解决方法,但是没有纯粹的方法来匹配\bfoo\b序列。

答案 3 :(得分:0)

正如其他人所说的那样,没有办法用一个正则表达式来做。但是有一个解决方法。

  1. 选择#以及之后的所有内容:
  2.  
    #.*
    
    1. 复制突出显示的部分并将其粘贴在括号中代替 HERE
    2. foo(?=.*\QHERE\E)
      

      enter image description here