• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:rubyの正規表現について質問です。)

Ruby正規表現の質問:testを置換してタグにする方法は?

このQ&Aのポイント
  • Rubyを勉強中の方から正規表現に関する質問があります。具体的には、文字列「test」を「#test」という形式に置換したい場合と、そのままの形式で置換したい場合を別々に扱いたいとのことです。
  • 現在はif文を使って対応しているが、一つの正規表現で両方のケースに対応する方法はあるのか疑問に感じています。
  • 正規表現でANDを使う方法はないようですが、他にどのような記述方法が考えられるでしょうか?ご教示いただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

違いが全く分かりませんが、 例えば、 test→#test #test→#test として出力したい場合以下のようにすれば可能です。参考になればですが・・。 str.gsub(/(?<!#)(?=test)/,'#')

catsuya
質問者

お礼

汲み取っていただき、ありがとうございます。 大変参考になりました!!

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

(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"

catsuya
質問者

お礼

説明が曖昧で申し訳ありません。 (1),(2)は不要です。 やりたかったのは、下記になります。 test → #test test → test

回答No.1

注意力が足りなりのかもしれませんが、(1)と(2)の違いがよく分からないです。変換元が両方testに見えますので、どのような条件なのか補足をお願いします。 文字列の置換は、Stringクラスのgsub(全ての文字列が対象)かsub(最初に見つかった文字列が対象)を使うのが一般的です。 http://doc.okkez.net/static/187/method/String/i/gsub.html http://doc.okkez.net/static/187/method/String/i/sub.html 正規表現のリファレンスはこちら。 http://doc.okkez.net/static/187/doc/spec=2fregexp.html 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" 基本的なことは、分かっていらっしゃるのかも知れませんが。

catsuya
質問者

お礼

ご回答ありがとうございます。 (1),(2)は不要です。 やりたかったのは、下記になります。 test → #test test → test やはり、組み合わせや条件分岐するのが良さそうですね。

関連するQ&A