• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:いずれかのパターンにマッチング)

スクリプトによる英文の特定の文のみの表示で問題が発生する理由

このQ&Aのポイント
  • 英文から特定のパターンを含む文のみを表示するスクリプトを作成していますが、予期しない文も表示されてしまっています。
  • スクリプトの中のelsif節が正しく動作していないため、意図しない文も処理されてしまう原因です。
  • 具体的には、正規表現のマッチングパターンが誤っており、除外すべき文も処理されてしまっている可能性があります。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4854/10269)
回答No.1

else b =~ /\s+with\s+/i ↑ else じゃなくて、elsif です。 3つの条件のどれが成り立っても a<<b と同じ処理をするので、条件を「または」でつなぐとプログラムが簡単になります。 あと工夫すべき所としては、例えば to が行頭や行末にある場合。

Fournines
質問者

お礼

ありがとうございます。おかげさまで解決いたしました。 orで繋ぐというのを今知りました。 行末、行頭の条件式を加えて改良したいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Rubyプログラミングの課題について☆

    大学のレポートで下のような課題が出て、実際プログラムを自分で作って実行してみたのですが、全く無反応でいくら考えても原因がわかりません(T_T)批判されそうな質問かもしれないですが、留年かかっているので親切な方、助言お願いします。。 ●下の動作をするプログラム(a.rb)を作れ  %a.rb "+[1,20] =>21 %a.rb "*[-1,25,4] =>-100 ●作ってみたプログラム↓ class Array def list_ope d=0 #最終的に返す値 s=0 #状態番号 x="" #一時的に数値を入れる op="" #[+,-,*,/] sgn=1 #マイナスの符号のあるなし err=999999 self.each{|i| case s #とりあえず、[+,-,*,/]をopに代入 when 0 op=i s=1 when 1 if /\[/ =~ i  s=2 else s=err; bleak end when 2 sgn=1; x=0; if /[1-9]/ =~ i #1~9の時 x+=i; s=3 elsif /-/ =~ i #マイナスの時 sgn=-1; s=3 else s=err; bleak end when 3 if /[0-9]/ =~ i #0~9の時 x+=i; elsif /,/ =~ i #コンマの時 x=sgn*x.to_i; s=4 elsif /\]/ =~ i #]の時 x=sgn*x.to_i; s=5 else s=err; bleak end when 4 #コンマの時の処理 if /\+/ =~op d=d+x elsif /-/ =~ op d=d-x elsif /\*/ =~ op d=d*x elsif / =~ op d=d/x end s=2 when 5 #]のときの処理 if /\+/ =~op d=d+x elsif /-/ =~ op d=d-x elsif /\*/ =~ op d=d*x elsif / =~ op d=d/x end s=6 #終了状態 end } if s==6 return d #dを返す else print "error!" end end end

  • 2行読み込んで一行戻り、また2行読み込む

    2行読み込んで一行戻り、また2行読み込む はじめまして、現在、「2行読み込み、一行戻り、また2行読み込む」処理のものを作成しています。 具体的には、 A B C D E と5行に渡り記述されたファイルを上記の旨で表示させる場合、 A B B C C D D E としたいのですが、 filename = ARGV[0] ABCDE = [] file = open(filename) while f = file.gets do  f.chomp!   g = file.gets   g.chomp!  p f  p g end file.close とすると出力は "A" "B" "C" "D" abcde.rb:9: private method `chomp!' called for nil:NilClass (NoMethodError) もちろん2行読み込んで、そのまま次の2行を読み込む記述のため上記のようになってしまいます。 まとめますと、 「一行戻るための記述がわからないので、それを実現するための記述を教えてほしい」 ということです。 rewindを使うと先頭まで戻ってしまうのでどうしたらいいのかさっぱりです。 わかりづらくて非常に申し訳ない、初歩的であろう質問ですがよろしくお願いします。 rubyは1.8.6を使っています。

    • ベストアンサー
    • Ruby
  • どこが間違いか分かりません。(Ruby)

    Rubyを使ったプログラムが巧く行かないのですが、どこでエラーが出ているのか分かりません。どなたか何が原因でエラーが起こったのか教えて頂けないでしょうか。 以下ソースコードです。 class SolitaireCipher $deck = (1..52).to_a+['A','B'] def solitaire(count) key_stream = [] until key_stream.size == count a = $deck.index("A") $deck.delete("A") if a == 53 a = 0 else a += 1 end $deck.insert(a,"A") b = $deck.index("B") $deck.delete("B") if b == 52 b = 1 elsif b == 53 b = 2 else b = b+2 end $deck.insert(b,"B") a1 = $deck[0..b-1] a2 = $deck[b..a] a3 = $deck[a+1..53] $deck = a3+a2+a1 if $deck[53] == 'A' t1 = 27 elsif $deck[53] == 'B' t1 = 27 else t1 = $deck[53] end a4 = $deck[0..t1-1] $deck = ($deck-a4).insert(52,a4).flatten! i = $deck[0].to_i key = $deck[i] key_stream << key end key_stream_s = key_stream.join n = 5 while n < key_stream_s.size key_stream_s[n,0] = " " n += 6 end key_stream = key_stream_s.split(" ") end end s = SolitaireCipher.new p s.solitaire(20) このプログラムを実行したときに、どういう訳かuntil文の中で毎回$deckの値が初期化されるようです。 そのため結果が以下のようになります。 ["44444", "44444", "44444", "44444"] 初心者プログラマーなので何か初歩的な間違いをしているのかもしれません。 どなたかエラーの原因を教えて頂けないでしょうか。 読みにくいプログラムではありますがよろしくおねがいします。

  • 日本語のマッチング(正規表現)

    以前解決済みとしたのですが、解決していないので もう一度よろしくお願いします。 以下のプログラムは、xxx.txtの内容を例えば、 (1)ぁ→ァ (2)シイ→シー (3)オウ→オー に変化させようというものです。 現在のところ、出力ファイルには何も変化していない ファイルが出力されるだけです。 use encoding 'euc-jp';は5.8.4では通りますが、 5.8.7ではエラーとなってしまいます。 入力ファイルの文字コードはEUC、改行コードはLF。 このperlファイルも同じ文字、改行コードを用いて います。 どのように書けばよいのか、よろしくお願いいたします。 open(IN, "xxx.txt"); open(OUT, "> ***.txt"); while($b=<IN>){ for($i=0; $i<=258; $i++){ if($b[$i] =~ /[ぁぃぅぇぉ]/){ $b[$i] =~ s/[ぁぃぅぇぉ]/[ァィゥェォ]/; } if($b[$i] =~ /[イシチニ]イ/){ $b[$i] =~ s/イ/ー/; } if($b[$i] =~ /[オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ]ウ/){ $b[$i] =~ s/ウ/ー/; } } } close(IN); close(OUT);

    • ベストアンサー
    • Perl
  • FORTRANの出力データの左寄せができません。

    素数を一万個見つけてそれを規定のフォーマットでTXTファイル出力しなければいけないのですがRANGEの右側の列をハイフンのすぐ隣に左寄せしてファイルに出力したいのですがどうしてもよくわかりません。FやE使って試しましたがエラーが出てコンパイルできなかったです。左寄せ以外にももっと効率のいいコーディングありましたらアドバイスいただけませんか? FORMAT110の真ん中のI6なんですけどこの値が右寄せでTXTファイルに残ります。最初のI6が右寄せでハイフンはさんで二個目のI6が同じ右寄せだとみっともないのです。 110 FORMAT(I6, 1X, ('-'), 1X, I6, T17, 12(2X, I6)) S = 1  L = 12 WRITE (15,110) S, L, P(S:L) DO 60 S = S + 12,10000,12 L = L + 12 IF ( S .EQ. 9985 .AND. L .EQ. 9996) THEN A = S + 12 B = L + 4 WRITE (15,110) A, B, P(A:B) GO TO 99 ELSE WRITE (15,110) S, L, P(S:L) END IF 60 CONTINUE C END IF 99 CLOSE (15) END

  • FileSearchがエクセル2007で使えなくなって困っています。

    2003では普通に使えたのですが、2007で使うためにはどのように変えればいいのでしょうか?途方にくれているのでVBAに詳しい方ご教授ください。処理文で回答頂けるとうれしいです。 Public Sub p_更新() For i = 1 To 100: gwKillFL(i) = "": Next i With Application.FileSearch .LookIn = gAAFLD .SearchSubFolders = True .Filename = "*T" & Format(gBB, "00") & ".txt" .FileType = msoFileTypeAllFiles If .Execute(SortBy:=msoSortByFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count gwKillFL(i) = .FoundFiles(i) Call p_ReadData(.FoundFiles(i)) Next i For i = 1 To .FoundFiles.Count If gwKillFL(i) <> "" Then Kill gwKillFL(i) End If Next i If gMenu1 > 0 Then Range("A2").Select MsgBox "更新", vbOKOnly, "確認" End If Else If gMenu1 > 0 Then MsgBox "更新ファイルなし。", vbOKOnly, "確認" End If End If End With End Sub

  • 勝敗に関する英語

    AはBに2-1で勝った。は、A won the game with B by 2 to 1. でいいでしょうか。また、AはBに1-2 で負けた。は A lost the game with B by 1 to 2.でいいでしょうか。最後にAはBに2-2で引き分けた。はどう言えばいいですか。

  • Visual Basic Editorの実行時エラーのことについて教えてください。 

    Visual Basic超初心者ですがよろしくお願いします。 標準モジュールで入力したものを実行すると、必ず「実行時エラー "53": ファイルが見つかりません。」と表示してしまいます。 入力したものはミスはないと思うのですが、何回やってもエラーが出てしまいます。 わかる方いましたら教えてください。 入力したものを一応載せときます↓ Sub list_file() Dim numfile As Long Dim i As Long With Application.FileSearch .NewSearch .LookIn = Range("b1").Value .Filename = Range("b2").Value .SearchSubFolders = Range("b3").Value If .Execute() > 0 Then file_count = .FoundFiles.Count MsgBox file_count & "files exis" Worksheets.Add after:=Worksheets("sheet1") Range("a1").Value = "filename" Range("b1").Value = "date" Range("c1").Value = "size" For i = 1 To file_count Cells(i + 1, 1).Value = .FoundFiles(i) Cells(i + 1, 2).Value = FileDateTime(.FoundFiles(i)) Cells(i + 1, 3).Value = FileLen(.FoundFiles(i)) Cells(i + 1, 2).Value = Hex(Cells(i + 1, 3).Value) Next Columns("a:c").AutoFit Else MsgBox "no file exists" End If End With End Sub

  • VBAで、[.FoundFiles.count]で取得した値の変数Cへの渡し方

    VBAで、[.FoundFiles.count]で取得した値を C=.FoundFiles.count(理想) としたいです。そして以下のコードのFor文の.FoundFiles.countをCとしたいのですが、思うようにいきません。その方法を教えて頂きたいのです。宜しくお願い致します。 With Application.FileSearch .LookIn = largept .Filename = "*.txt" If .Execute > 0 Then   For i = 1 to .FoundFiles.Count     ...     処理     ...   Next i Else End If End With

  • 【ファイルサーチ】指定のフォルダーではなく自分で選択したフォルダー内のファイルの総数をカウントしたい

    お世話になります。指定のフォルダーではなく自分で選択したフォルダー内の"csvファイル"の総数をカウントしたいのですがうまくいきません。アドバイスお願いいたします。 With Application.FileSearch .LookIn = Application.GetOpenFilename .Filename = "*.csv" If .Execute > 0 Then MsgBox .FoundFiles.Count & "個" End If For i = 1 To .FoundFiles.Count MsgBox .FoundFiles(i) Next i End With