1

私は文字列を持っています

str = "'${1:textbox}',[${2:x},${3:y},${4:w},${5:h}]"

との,間のすべてを単一のスペースに置き換えたいと思います。[]

私は次のようなものを使用しようとしました

str.gsub!(/(?<=\[)\,*?(?=\])/," ")

成功せずに。\,ただし、式をに置き換えると.、期待される出力が得られます。

str.gsub!(/(?<=\[).*?(?=\])/," ")

== "'${1:textbox}',[  ]"

誰かがこの状況で使用する適切な正規表現手法を説明し、おそらく私が上に投稿した例が失敗した理由と成功した理由を説明してもらえますか?

私は使っているruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin10.8.0]

4

2 に答える 2

5

単一の正規表現でこれを行うことは可能かもしれませんが、可能であったとしても、説明できないほど醜いものになることは保証できます。「ネストされた」置換を使用する方がはるかに簡単です。1 つの gsub を使用して角かっこで囲まれた部分文字列を見つけてから、別の gsub を使用してカンマを交換します。

str.gsub(/\[.*?\]/) do |substr|
    substr.gsub(',', ' ')
end

残念ながら、あなたの試みが失敗した理由を説明することはできません-どちらも私のために実行されませんでした(ruby 1.8.7 / irb 0.9.5)。IRB は、漠然と「不正な正規表現構文」というエラーを出しました。そして、私はそれらがどのように機能するかを完全に理解することはできません(編集:mu is too short は彼の答えに素晴らしい内訳があります-それをチェックしてください)。とにかくこれが役に立てば幸いです!

于 2012-09-07T21:50:52.163 に答える
5

この正規表現:

/(?<=\[)\,*?(?=\])/

左角かっこの後に一連のコンマ (任意の長さ) が続き、その後に右角かっこが続くものを探しています。これは、次のようなことを意味します。

[]
[,]
[,,,,,,,,,,,]

あなたの文字列はそのようには見えないので、最初のgsub!ものは何もしません。これを行う場合:

'[,,,,,,]'.gsub(/(?<=\[),*?(?=\])/, " ")

あなた'[ ]'の悩みを解決します。

2 番目の正規表現:

/(?<=\[).*?(?=\])/

にでも一致するため.*?(もちろん、改行と修飾子の対象/m/s、および間の文字列の部分[]確かに any として修飾されるため、機能します。

これを作成しようとしている場合:

"'${1:textbox}',[${2:x} ${3:y} ${4:w} ${5:h}]"

次に、Xavier Holt のネストされたgsubアプローチを使用します。これはシンプルでクリーンです。

于 2012-09-07T22:00:39.007 に答える