我正在寻找一个常规的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)
对于编辑很抱歉,当我首先提出问题时,我非常不精确.希望现在更加清晰.
(我知道你自己刚刚发布了几乎完全相同的答案,但我不忍心把这一切都丢掉.: - /)
如果可以通过正则表达式拆分操作来解决您的问题,正如MSalters所说,正则表达式必须匹配偶数个引号.但是,拆分正则表达式应仅匹配您正在拆分的空间,因此其余工作必须在前瞻中完成.这是我会用的:
" +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"
Run Code Online (Sandbox Code Playgroud)
如果文本格式正确,则偶数引号的前瞻足以确定刚刚匹配的空间不在引用序列中.也就是说,lookbehinds不是必需的,这很好,因为QRegExp似乎不支持它们.转义报价也可以适应,但正则表达式变得更大,更丑陋.但如果你不能确定文本是否格式正确,那么你就不太可能解决你的问题split()
.
顺便说一下,QRegExp 没有实现POSIX正则表达式 -如果它确实如此,它将不支持前瞻或后观.相反,它属于松散定义的Perl兼容正则表达式类别.