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

时间:2008-10-15 16:56:15

标签: ruby regex

我正在尝试编写一个正则表达式来替换引号中未包含的所有空格,如下所示:

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

会返回这个:

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

我花了一些时间搜索这个网站,我找到了一个类似的q / a(Split a string by spaces -- preserving quoted substrings -- in Python),用一个可以在擦除所有其他空格后重新替换的标记替换引号内的所有空格。 ..但我希望有一种更清洁的方式。

4 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:4)

这似乎有效:

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

答案 2 :(得分:2)

我认为这很干净:

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

我怀疑 gsub 可以做得更好(假设您需要纯正则表达式方法)。

答案 3 :(得分:0)

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

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