使用正则表达式替换Ruby中引号之外的所有空格

我正在尝试编写一个正则表达式来替换所有未包含在引号中的空格,所以这样的事情:

a = 4, b = 2, c = "space here" 

会回来的:

 a=4,b=2,c="space here" 

我花了一些时间搜索这个网站,我发现了一个类似的q / a( 用空格分割一个字符串 – 保留引用的子串 – 在Python中 ),它将用一个可以在之后重新替换的标记替换引号内的所有空格擦拭所有其他空间……但我希望有一种更清洁的方式。

值得注意的是, 任何正则表达式解决方案都会在以下情况下失败:

 a = 4, b = 2, c = "space" here" 

虽然你可以构建一个正则表达式来专门处理三引号的情况,但你无法解决一般意义上的问题。 这是简单DFA的数学上可certificate的限制,其中正则表达式是直接表示。 要执行任何严格的大括号/引号匹配,您将需要更强大的下推自动机 ,通常采用文本解析器库(ANTLR,Bison,Parsec)的forms。

话虽如此,听起来正则表达式应该足以满足您的需求。 请注意这些限制。

这似乎有效:

 result = string.gsub(/( |(".*?"))/, "\\2") 

我认为这很干净:

 mystring.scan(/((".*?")|([^ ]))/).map { |x| x[0] }.join 

我怀疑gsub可以做得更好(假设你想要一个纯粹的正则表达式方法)。

尝试这个,单/双引号中的字符串也匹配(所以你需要过滤它们,如果你只需要空格):

 /( |("([^"\\]|\\.)*")|('([^'\\]|\\.)*'))/