我想要一个正则表达式来匹配双引号中的所有单词。
考虑一下:
the quick "brown fox" jumps
应匹配brown
和fox
字样,但不能匹配the
,quick
或jumps
。
以下是我的第一次尝试:
".*\zs\w\+\ze.*"
不幸的是,.*
的贪婪会导致正则表达式消耗超出我想要的内容,只有x
中的fox
匹配。使用\{-}
代替*
(vim的非贪婪等价物),我们得到修改后的正则表达式:
".\{-}\zs\w\+\ze.*"
但是这只匹配引号中的第一个单词(brown
),而不是我想要的所有单词。
我正在尝试做的是用正则表达式完成的吗?
答案 0 :(得分:5)
使用正向后方\@<=
和正向前瞻\@=
,您可以获得以下内容:
\("\(\w\+ \)*\)\@<=\w\+\(.*"\)\@=
因此,您要求\("\(\w\+ \)*\)
的零宽度匹配,这意味着引号字符后跟0或更多单词后跟空格\(\w\+ \)
需要在模式之前匹配。在模式之后,您可以有一系列任意字符.*
后跟引号,但这也需要匹配。
有关更多示例,请参阅:h /\@<=
和:h /\@=
。通常可以使用\zs
代替\@<=
,但在这种情况下,它只匹配最后一个单词。