如何使用Regex中的“向前看”和“向后看”来处理中间的单词?

时间:2014-12-26 22:36:54

标签: regex

从这个问题的@skyfoot回答 regex-lookahead-lookbehind-and-atomic-groups

他说:

given the string `foobarbarfoo`

    bar(?=bar)     finds the first bar.
    bar(?!bar)     finds the second bar.
    (?<=foo)bar    finds the first bar.
    (?<!foo)bar    finds the second bar.

you can also combine them

    (?<=foo)bar(?=bar)    finds the first bar.


发生了什么事情,假设我有字符串&#34; barfoobarbarfoo&#34;

我想找到这些粗体文字

&#34;杆的 FOO 巴的 FOO&#34;

正则表达式可能是:(?<=bar)foo(????)bar(?=foo)

问题是中间应该是什么表达式(look aheadlook behide)?

2 个答案:

答案 0 :(得分:1)

尝试这种模式

foo(?=bar)|(?<=bar)bar  

Demo

答案 1 :(得分:1)

完成你的例子:

bar(?=bar)     finds the `bar` followed by `bar`
bar(?!bar)     finds the `bar` NOT followed by `bar`
(?<=foo)bar    finds the `bar` preceeded by `foo`
(?<!foo)bar    finds the `bar` NOT preceeded by `foo`

因此,在您的情况下,您希望foo先于bar AND ,然后是bar。使用上面的例子,这应该给出:

(?<=bar)foo(?=bar)

然后,要找到bar之后的bar AND ,然后是foo,您应该使用:

(?<=bar)bar(?=foo)

最后,要结合这两种模式,您应该使用 OR 运算符,最终得到以下结果:

(?<=bar)foo(?=bar)|(?<=bar)bar(?=foo)

DEMO