正则表达式匹配空格,但不是"字符串"

Gun*_*iez 4 c c++ regex qt

我正在寻找一个常规的exression匹配空格,只有当thos空格没有用双引号(")括起来时.例如,在

Mary had "a little lamb"
Run Code Online (Sandbox Code Playgroud)

它应该匹配第一个和第二个空间,而不是其他空间.

我想将字符串拆分在不在双引号中的空格处,而不是在引号处.

我正在使用C++与Qt工具包,并希望使用QString :: split(QRegExp).QString与std :: string非常相似,而QRegExp基本上是封装在类中的POSIX正则表达式.如果存在这样的正则表达式,那么拆分将是微不足道的.

例子:

Mary had "a little lamb"     =>   Mary,had,"a little lamb"
1" 2 "3                      =>   1" 2 "3 (no splitting at ")
abc def="g h i" "j k" = 12   =>   abc,def="g h i","j k",=,12
Run Code Online (Sandbox Code Playgroud)

对于编辑很抱歉,当我首先提出问题时,我非常不精确.希望现在更加清晰.

Ala*_*ore 8

(我知道你自己刚刚发布了几乎完全相同的答案,但我不忍心把这一切都丢掉.: - /)

如果可以通过正则表达式拆分操作来解决您的问题,正如MSalters所说,正则表达式必须匹配偶数个引号.但是,拆分正则表达式应仅匹配您正在拆分的空间,因此其余工作必须在前瞻中完成.这是我会用的:

" +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"
Run Code Online (Sandbox Code Playgroud)

如果文本格式正确,则偶数引号的前瞻足以确定刚刚匹配的空间不在引用序列中.也就是说,lookbehinds不是必需的,这很好,因为QRegExp似乎不支持它们.转义报价也可以适应,但正则表达式变得更大,更丑陋.但如果你不能确定文本是否格式正确,那么你就不太可能解决你的问题split().

顺便说一下,QRegExp 没有实现POSIX正则表达式 -如果它确实如此,它将不支持前瞻或后观.相反,它属于松散定义的Perl兼容正则表达式类别.