如何检测未引用或双引号的空间

Vic*_*azi 5 java regex regex-negation regex-lookarounds

我正在尝试创建一个Java正则表达式,它将用一个空格替换字符串中出现的所有空格,除非引号之间出现白色空格(单引号或双引号)

如果我只是在寻找双引号,我可以使用前瞻:

text.replaceAll("\\s+ (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", " ");
Run Code Online (Sandbox Code Playgroud)

如果我只是在寻找单引号,我可以使用类似的模式.

诀窍是找到两者.

我有个好主意运行双引号模式后跟单引号模式,但当然最终会替换所有空格而不管引号.

所以这里有一些测试和预期结果

a   b   c    d   e   -->  a b c d e
a   b   "c    d"   e -->  a b "c    d" e
a   b   'c    d'   e -->  a b 'c    d' e
a   b   "c    d'   e -->  a b "c d' e    (Can't mix and match quotes)
Run Code Online (Sandbox Code Playgroud)

有没有办法在Java正则表达式中实现这一目标?

假设已经单独验证了无效输入.因此,以下任何一种都不会发生:

a "b c ' d
a 'b " c' d
a 'b c d
Run Code Online (Sandbox Code Playgroud)

小智 1

我建议标准化您的字符串封装。使用正则表达式来替换标准的替代方案。假设您选择双引号 " 那么您可以将字符串拆分为 " 并且所有奇数元素都是带引号的内容,偶数元素将不带引号,仅对偶数元素运行正则表达式替换并从更改后的数组重建字符串。