正则表达式提取部分字符串

时间:2013-05-24 10:47:28

标签: regex notepad++

我有一个

形式的字符串
Foo
"Foo"
"Some Foo"
"Some Foo and more"

我需要提取引号中的值Foo,并且可以被任意数量的字母数字和空格字符包围。因此,对于上面的示例,我希望输出为

<NoMatch>
Foo
Foo
Foo

我一直试图让这个工作,这是我到目前为止使用lookahead / lookbehind引用的模式。这适用于"Foo"但不适用于其他人。

(?<=")Foo(?=")

进一步扩展到

(?<=")(?<=.*?)Foo(?=.*?)(?=")

不起作用。

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:9)

如果引号被正确平衡且引用的字符串不跨越多行,那么您可以简单地向前看字符串以检查是否跟随偶数引号。如果那不是真的,我们知道我们在引用的字符串中:

Foo(?![^"\r\n]*(?:"[^"\r\n]*"[^"\r\n]*)*$)

<强>解释

Foo          # Match Foo
(?!          # only if the following can't be matched here:
 [^"\r\n]*   # Any number of characters except quotes or newlines
 (?:         # followed by
  "[^"\r\n]* # (a quote and any number of non-quotes/newlines
  "[^"\r\n]* # twice)
 )*          # any number of times.
 $           # End of the line
)            # End of lookahead assertion

regex101.com

上查看

答案 1 :(得分:1)

环视((?<=something)(?=something))不适用于变长模式,即.*。试试这个:

(?<=")(.*?)(Foo)(.*?)(?=")

然后使用匹配字符串(取决于您的语言:$1,$2,...\1,\2,...或某些数组的成员或类似内容)。

答案 2 :(得分:0)

尝试用这种模式做点什么:

"[^"]*?Foo[^"]*?"

答案 3 :(得分:0)

在Notepad ++中

search : ("[^"]*)Foo([^"]*")
replace : $1Bar$2