2014-02-08 25 views

回答

2

"foo(bar baz)bom".gsub(/((?<!)\(|\)(?!))/,"(" =>" (",")" =>") ")

會做的伎倆。

+0

匹配非空格和不匹配空格有區別,例如'「(x)」=>「(x)」' – pguardiario

2

待辦事項如下

>> "foo(bar baz)bom".gsub(/[)(]/,"(" =>" (",")" =>") ") 
=> "foo (bar baz) bom" 
>> 

更新

>> "foo (bar baz)bom".gsub(/(?<=\S)\(|\)(?=\S)/,"(" =>" (",")" =>") ") 
=> "foo (bar baz) bom" 
>> "foo(bar baz)bom".gsub(/(?<=\S)\(|\)(?=\S)/,"(" =>" (",")" =>") ") 
=> "foo (bar baz) bom" 
>> "foo(bar baz) bom".gsub(/(?<=\S)\(|\)(?=\S)/,"(" =>" (",")" =>") ") 
=> "foo (bar baz) bom" 
>> 
+0

如果字符串像「foo(bar baz)bom」,這會在parens周圍增加額外的空白。 「foo(bar baz)bom」=>「foo [兩個空格](bar baz)[兩個空格] bom」 – deruse

+0

@dhruvg然後在最後一個'squeeze(「」)'.. –

+0

有沒有gsub唯一方法,這並不複雜得多? – deruse

0

這種情況很容易:

"foo(bar baz)bom".gsub(/(?<!\s)(?=\()|(?<=\))(?!\s)/, " ") 
# => "foo (bar baz) bom" 
0

你在正確的軌道上\S\)|\)\S

"foo(bar baz)bom".gsub /(?=\S\(|\)\S)(.)(.)/, '\1 \2' 
#=> "foo (bar baz) bom" 
0

如果你沒有絕對要使用GSUB,你能做到這樣。這是更詳細的,但對我來說,它比長而複雜的正則表達式更容易閱讀:

s = "foo(bar baz)bom" 
while s =~ /\w\(/ 
    s = $` + $&[0] + ' (' + $' 
end 
while s =~ /\)\w/ 
    s = $` + ') ' + $&[1] + $' 
end 

就像我說的,這是冗長。但它很直接,沒有猜測。

當然,你可以,如果你喜歡使用字符串插值而非+或< <與

"#{$`}#{$&[0]} (#{$'}" 

更換

$` + $&[0] + ' (' + $' 

。但我認爲第一種形式更容易閱讀。

如果您對此表示法不熟悉,$`是匹配前字符串的一部分,$ &是匹配的字符串,$'是匹配後的部分。很容易記住哪些是因爲它在鍵盤上保持不變。