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

5
我有一个字符串,形式为:
Foo
"Foo"
"Some Foo"
"Some Foo and more"

我需要提取被引号包围的值Foo,该值可以被任意数量的字母数字和空格字符所包围。因此,对于上面的示例,我希望输出结果为:
<NoMatch>
Foo
Foo
Foo

我一直在尝试让这个工作起来,目前我使用了引号的前后查找模式。这对于"Foo"有效,但对于其他情况无效。

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

进一步扩展到
(?<=")(?<=.*?)Foo(?=.*?)(?=")

无法工作。

任何帮助将不胜感激!


1
你说“被字母数字字符包围”。引号和空格不是字母数字字符。 - Barmar
你使用什么编程语言? - Casimir et Hippolyte
我正在使用它作为在Notepad++中进行搜索和替换的一部分。 - Kami
@Barmar 谢谢,我已经重新措辞了问题。 - Kami
你能确定以下几点吗?a) 引号是否总是正确配对?b) 是否没有任何转义引号?c) 引用的字符串是否从不跨越多行? - Tim Pietzcker
@TimPietzcker 是的,它们将始终保持平衡,并且文本中不需要其他引号。 - Kami
4个回答

11

如果引号正确平衡且引用的字符串不跨越多行,则可以简单地向前查看字符串以检查是否有偶数个引号。如果不是这样,我们就知道我们在引用字符串中:

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上可以实时查看。

有没有办法在没有引号的情况下排除该行?目前,此模式匹配Foo以及"Foo" - Kami
@Kami:不应该这样做。请查看测试链接。可能需要在正则表达式前加上“(?m)”,以确保“$”匹配行末,而不仅仅是文件末尾。但通常这是文本编辑器的默认行为。 - Tim Pietzcker

3

回顾先行断言 ((?<=something)(?=something)) 不能用于变长模式,即.*。请尝试以下方法:

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

然后使用匹配字符串(根据您的语言:$1,$2,...\1,\2,...或某些数组成员等)。


这个匹配整行,我只想提取 Foo - Kami
@Kami,您正在提取它作为第二个匹配字符串。不可否认,这里的环视没有用处。 - Vedran Šego

0

尝试使用这种模式做一些事情:

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

这个匹配整行,我只想提取 Foo - Kami
@Kami:你必须在想要保留的内容周围添加捕获括号。 - Casimir et Hippolyte

0
在Notepad++中
search : ("[^"]*)Foo([^"]*")
replace : $1Bar$2

如果在引号字符串中有两个 Foo,会怎么样? - Tim Pietzcker
@TimPietzcker:只有一个被替换了。但是由于OP没有提到任何其他信息,这可能已经足够了。 - Toto
2
@TimPietzcker:您可以再次点击“replaceAll”按钮。 - Casimir et Hippolyte
@CasimiretHippolyte:呃。:) - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接