有和没有前瞻和后视的正则表达式

时间:2013-06-06 11:18:24

标签: regex

我有一个字符串,看起来像这些例子:

  1. lookbehind text bla lookahead
  2. lookbehind text bla
  3. text bla lookahead
  4. text bla
  5. 如何在每种情况text bla匹配? text bla可能是一些带有空格的字符串。

    使用正则表达式(?<=lookbehind\s)[\w\s]+(?=\slookahead)它只适用于没有。 1。

    如何涵盖其他例子?

4 个答案:

答案 0 :(得分:5)

试试这个:

^(?:.*lookbehind\s*)?((?:(?!\slookahead)[\w ])+)

here on Regexr

这有点复杂,我发现没有更简单的解决方案。结果总是在捕获组1,因为我匹配“lookbehind \ s *”,如果它在那里。

^字符串的开头

(?:lookbehind\s*)?可选组,与所有后续空格匹配“lookbehind”。

现在有点复杂的部分:

(                              # Start of the capturing group, stores the interesting part in group 1
    (?:                        # Non capturing group
        (?!\slookahead)[\w\s]  # Match [\w\s] only if it is not the start of the sequence "\slookahead"
    )+                         # repeat this
)

答案 1 :(得分:2)

以下正则表达式应该对你有用:

(?:(?!lookbehind|lookahead)\b\w+\b| )+

现场演示:http://www.rubular.com/r/rBB3GmgBec

答案 2 :(得分:0)

作为一种不同的方法,您可以使用正则表达式替换来删除所有不需要的文本(lookbehind和lookahead部分)。

\s*(?:lookbehind|lookahead)\s*

这是C#中的一个例子:

string result = Regex.Replace(testInput, @"\s*(?:lookbehind|lookahead)\s*", "", RegexOptions.IgnoreCase);

答案 3 :(得分:0)

看起来你需要环顾四周以匹配某些文字开始/结束:

(?<=((lookbehind)|^)\s*)text bla(?=\s*(lookahead)|$)