我試圖轉換像字符串:正則表達式紅寶石GSUB:在捕獲組的字符之間插入空間
「富(巴巴茲)BOM」 =>「富(巴巴茲)BOM」
我有這個到目前爲止:
"foo(bar baz)bom".gsub(/((\S\()|(\)\S))/,'\1')
但我不知道如何處理'\ 1'在parens和字符之間插入一個空格。
謝謝!
我試圖轉換像字符串:正則表達式紅寶石GSUB:在捕獲組的字符之間插入空間
「富(巴巴茲)BOM」 =>「富(巴巴茲)BOM」
我有這個到目前爲止:
"foo(bar baz)bom".gsub(/((\S\()|(\)\S))/,'\1')
但我不知道如何處理'\ 1'在parens和字符之間插入一個空格。
謝謝!
"foo(bar baz)bom".gsub(/((?<!)\(|\)(?!))/,"(" =>" (",")" =>") ")
會做的伎倆。
待辦事項如下
>> "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"
>>
這種情況很容易:
"foo(bar baz)bom".gsub(/(?<!\s)(?=\()|(?<=\))(?!\s)/, " ")
# => "foo (bar baz) bom"
你在正確的軌道上\S\)|\)\S
:
"foo(bar baz)bom".gsub /(?=\S\(|\)\S)(.)(.)/, '\1 \2'
#=> "foo (bar baz) bom"
如果你沒有絕對要使用GSUB,你能做到這樣。這是更詳細的,但對我來說,它比長而複雜的正則表達式更容易閱讀:
s = "foo(bar baz)bom"
while s =~ /\w\(/
s = $` + $&[0] + ' (' + $'
end
while s =~ /\)\w/
s = $` + ') ' + $&[1] + $'
end
就像我說的,這是冗長。但它很直接,沒有猜測。
當然,你可以,如果你喜歡使用字符串插值而非+或< <與
"#{$`}#{$&[0]} (#{$'}"
更換
$` + $&[0] + ' (' + $'
。但我認爲第一種形式更容易閱讀。
如果您對此表示法不熟悉,$`是匹配前字符串的一部分,$ &是匹配的字符串,$'是匹配後的部分。很容易記住哪些是因爲它在鍵盤上保持不變。
匹配非空格和不匹配空格有區別,例如'「(x)」=>「(x)」' – pguardiario