我有一个
形式的字符串Foo
"Foo"
"Some Foo"
"Some Foo and more"
我需要提取引号中的值Foo
,并且可以被任意数量的字母数字和空格字符包围。因此,对于上面的示例,我希望输出为
<NoMatch>
Foo
Foo
Foo
我一直试图让这个工作,这是我到目前为止使用lookahead / lookbehind引用的模式。这适用于"Foo"
但不适用于其他人。
(?<=")Foo(?=")
进一步扩展到
(?<=")(?<=.*?)Foo(?=.*?)(?=")
不起作用。
任何帮助将不胜感激!
答案 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
上查看
答案 1 :(得分:1)
环视((?<=something)
和(?=something)
)不适用于变长模式,即.*
。试试这个:
(?<=")(.*?)(Foo)(.*?)(?=")
然后使用匹配字符串(取决于您的语言:$1,$2,...
或\1,\2,...
或某些数组的成员或类似内容)。
答案 2 :(得分:0)
尝试用这种模式做点什么:
"[^"]*?Foo[^"]*?"
答案 3 :(得分:0)
在Notepad ++中
search : ("[^"]*)Foo([^"]*")
replace : $1Bar$2