重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

rubyの正規表現について質問です。

rubyを勉強中ですが、
正規表現について質問させてください。

以下のようなことをしたいのですが、どのような記述をすれば実現できるでしょうか?

(1)test → #test
(2)test → test


「test」の場合は、「#」を加え、「#test」に置換したい
「test」の場合は、そのまま「test」としたい。

if を続ければ可能だとは思いますが、
一つの正規表現で(1)のケースだけを引っ掛けられればと思っています。

正規表現でANDが使えればよいのですが、使えないようですし。。。


お手数をおかけしますが、お力をよろしくお願いします。

A 回答 (3件)

違いが全く分かりませんが、


例えば、
test→#test
#test→#test
として出力したい場合以下のようにすれば可能です。参考になればですが・・。
str.gsub(/(?<!#)(?=test)/,'#')
    • good
    • 0
この回答へのお礼

汲み取っていただき、ありがとうございます。

大変参考になりました!!

お礼日時:2010/09/10 01:36

(1)testと(2)testの違いは、先頭に(1)があるか(2)があるかの違いでしょうか?


それなら、正規表現を使うまでもありません。
文字列が'(1)test'なら、'#test’に変換し、
文字列が'(2)test'なら、'test’に変換するだけです。
以下のソースで確認済み
-----------------------------
# coding:WINDOWS-31J
def test1()
moji1 = '(1)test'
moji2 = '(2)test'
moji3 = 'test'
ans1 = cnv(moji1)
ans2 = cnv(moji2)
ans3 = cnv(moji3)
p ans1
p ans2
p ans3
end
#文字列を変換した結果を返す
# (1)test -> #test
# (2)test -> test
#以外 そのまま
def cnv moji
if moji == '(1)test'
return '#test'
end
if moji == '(2)test'
return 'test'
end
return moji
end
test1()
--------------------------------
実行結果
"#test"
"test"
"test"
    • good
    • 0
この回答へのお礼

説明が曖昧で申し訳ありません。


(1),(2)は不要です。
やりたかったのは、下記になります。
test → #test
test → test

お礼日時:2010/09/10 01:35

注意力が足りなりのかもしれませんが、(1)と(2)の違いがよく分からないです。

変換元が両方testに見えますので、どのような条件なのか補足をお願いします。

文字列の置換は、Stringクラスのgsub(全ての文字列が対象)かsub(最初に見つかった文字列が対象)を使うのが一般的です。
http://doc.okkez.net/static/187/method/String/i/ …
http://doc.okkez.net/static/187/method/String/i/ …

正規表現のリファレンスはこちら。
http://doc.okkez.net/static/187/doc/spec=2fregex …

p 'test1test2'.gsub(/test/,'#test')
p 'test1test2'.gsub(/(test)/,'#\1')
p 'test1test2'.gsub(/(test)/){ '#' + $1 }
=> "#test1#test2"

p 'test1test2'.sub(/test/,'#test')
=> "#test1test2"

「ある条件の場合のみ置換し、それ以外の場合は置換しない」のであれば、それ程苦労せずに(分岐なしに)記述できると思います。

複雑な条件では、ブロックに渡して、条件分岐など使えば何とかなります。
p '(1)test (2)test'.gsub(/\(([0-9]+)\)test/) {|s| $1=='1' ? '#test' : 'test' }
"#test test"

もしくは、何度かに分けて置換を行うのも手です。
str='(1)test (2)test'
=> "(1)test (2)test"
str = str.gsub(/\(1\)test/,'#test')
=> "#test (2)test"
str = str.gsub(/\([0-9]+\)test/,'test')
=> "#test test"

基本的なことは、分かっていらっしゃるのかも知れませんが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

(1),(2)は不要です。
やりたかったのは、下記になります。
test → #test
test → test

やはり、組み合わせや条件分岐するのが良さそうですね。

お礼日時:2010/09/10 01:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!