• ベストアンサー

文字列にコントロール文字を含むと何ができるの?

プログラミングPerlを読んでいます。 ページをめくる速度が、すっごい遅いのですが・・・ やっとこさ74ページまできました・・・ 今回の疑問は文字列中にコントロール文字を埋め込むと何ができるの? というものです。 この疑問が浮かんだきっかけは このページでコントロール文字を表す正規表現が紹介されていたからです。 このような正規表現が用意されているということはコントロール文字を使用した文字列マッチを行うことを想定しているのだと思います。 すなわちコントロール文字を含んだ文字列を扱う場面が出てくるのだと思うのです。 このような文字列は、どのような場面で登場するのでしょうか。 また、どのような働きをするのでしょうか。 恐らく文字列を画面やプリンターへ出力するのと同時に、何か別の事柄を一緒に行うのではないかと予想しているのですが・・・ ちょっと気になったので質問しました。 どなたか教えてください。

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> コントロール文字を表す正規表現 えーと手元にその本がないので(5.6時代のものなので 処分してしまった) 確かめられないのですけど、正規表現じゃなくて エスケープシーケンスとして解説されていませんか? まあそれはさておき、 \cX のような一般的な表記があるのは、言語デザイナーである Larry Wallの性格を反映したものだと思います。 つまり制御文字のような直接表記できない文字を表すのに (\nとか\r、\tなどを除外して) \033 とか \x1b とか書くことが 以前からできていたからです。 (UNIXでの)EOFはおっしゃるとおり ^D です。多分 Ctrl-D を連想するように \cD と書けたらわかりやすいよね。といった 経緯で導入されたんじゃないでしょうか。 で実際にどういうときに使うかですが、 たとえばテキスト処理を行うとして、いわゆる JISコードと呼ばれるような エンコーディングを使っているときには \c[ (\x1b, \033, \e)がテキスト中に現れます。 あとはWindowsのコマンドプロンプトでは 縁がありませんが、画面制御をするのにも この \c[ にあたる文字は使われます。

zyousuke
質問者

お礼

sakusaker7さん、ご返信ありがとうございます。 プログラミングPerlの正規表現の規則6:アトムの最後の所で次の解説文があります。 逆スラッシュの直後にcがあり、さらに1文字が続くもの(例えば\cD)は、対応するコントロール文字にマッチする。 また、45ページのエスケープシーケンスの一覧表には載っていませんでしたが ""中にコントロール文字をエスケープシーケンスとして記述できることを確認しました。 処分してしまったとはもったいない!! 私は、最新のプログラミングPerlが2冊構成になっているのを嫌い、わざわざヤフオクから旧版を取り寄せました^^ このようなコントロール文字の正規表現が用意された経緯や理由(の予想)は、興味深くためになりました。 そして、文字セットにJISコードを使用している場合には、このコントロール文字による文字列マッチにお目にかかるのですね。 あと、昨日ネットで調べたところユニックスではCtrlキーを押しながらJキーを押すと、Enterキーと同じ効果があることを知りました。 ですので次のコードを実行すると"マッチ\n"が表示できました。 $_ = " "; print("マッチ\n") if(/\cJ/); ようはパールお得意の、いろんな書き方ができるよ! という認識でいいですよね今は

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

今さら誰もやらないと思いますが, 「仮想的に 2次元 (以上の) 配列を作るためにハッシュを使う」という機能があります. このときに使うハッシュのキーには, 各次元の添字を区切るため通常コントロール文字が入ります. ... ということでいいのかなぁ?

zyousuke
質問者

お礼

ご返信ありがとうございます。 ハッシュ変数とコントロール文字を使用して仮想二次元配列を作成してみましたw キーはコントロール文字を含んだ文字列で構成されていますが、普通の文字列と同じように、何の問題もなく値を参照できました。 ・・・ということはパールで用意されている、コントロール文字を表す正規表現は、ハッシュ変数のキーを構成する文字列に対してマッチを行うときに使用することを想定しているのか!?? 私は、もっと長大な文字列に対してマッチを行うことを想像していたのですが、いかがでしょうか

回答No.1

一例をあげます。(こんなものでよろしければ) 「文字列中に改行が含まれていた場合はそれを削除する」 などに使用されます。 たとへば、 $hoge =~ s/\n|\r|\n\r//; などとしますと、元の$hogeに含まれていた改行を削除したものが新しい$hogeとなります。

zyousuke
質問者

お礼

ご回答ありがとうございます。 でも私が思い描いているコントロール文字の正規表現とは \cD みたいなやつなのです。 これは入力を終了するときのDキーの正規表現だと思うのですが、 これを文字列中に含むことができ、また s/\cD//; というようにやってマッチに使うこともできるらしいのですが、 このようなコントロール文字が混じった文字列の用途を知りたかったのです。 (ちなみに私が知っているコントロール文字はCとDぐらいかな・・・)

関連するQ&A

  • ある法則に従った文字列を抜き出す方法

    以前、ある法則に従った文字列を抜き出す処理をゴリゴリ頑張って作ったのですが、 正規表現で1発で対象文字列を抜き出す事は出来ないのか?と思いました。 しかし、正規表現をそのパターンの時どう記述すると実現出来るのか分からず断念しました。 例えば 1.あいうえお((abc:えー|びー))かきくけこ 2.あいうえお((abc:えー))かきくけこ 3.あいうえお((abc:えー|びー|しー))かきくけこ 4.あいうえお((abc:えー|びー|しー))かきくけこ((abc:でぃー)) こんなのがあった時、パターンとして「((abc:」から「))」の間の文字列を 取得したいです。 1.の時は「えー|びー」、2.の時は「えー」、3.の時は「えー|びー|しー」、 4.の時は「えー|びー|しー」と「でぃー」を、その正規表現にマッチする文字列だとしたいのです。 「((abc:」、「))」の間の文字列長は可変です。 どなたか上記を実現する正規表現をご教示下さい。 正規表現でマッチさせるからには「((abc:」、「))」という文字列もマッチした文字列として 取得するでしょうが、それは後処理で削る事になるので何の問題もありません。

    • ベストアンサー
    • PHP
  • 元の文字列をそのまま使う置換方法を教えてください。

    perlの置換で『aaa』の文字列にマッチする行を置換するにはどうしたらよいでしょうか。 宜しくお願いします。 1.『aaa』にマッチする 1111*aaa2222 2.『aaa』にマッチしない 1111*aaa\2222  1111*aaa_2222   1111,2222には数字や英文字が入ります。 また1.を置換するときに 1111*aaa2222cccc と元の文字列をそのまま使い『ccc』を追加する場合は 置換先はどのように書けばよいでしょうか。 現在正規表現を勉強中で、簡単なことでしたら申し訳ありません。 ヒントでもかまいませんので是非お教え願います。

    • ベストアンサー
    • Perl
  • ある文字列を抜き出す方法

    perlを使ってるわけじゃないのですが perl互換の正規表現ができるソフトで a1.*?x2 という正規表現を抜き出すようにしたいのですが どうすればいいでしょうか? a1.*?x2 という文字列は、文章の中に複数でてきて 文章に規則性などもなく「a1」と「x2」の前後も決まった文字ではありません 「a1」と「x2」の間の文字にも特に規則性はありません 気持ち的には [^(a.*?x)]*? を削除すればいいのかな。って思ってやってみましたが 上手くいきません 置換とか、使わないといけないのかなと思いますが 今さっき解説を読んだばかりであやふやです よろしくお願いします

    • ベストアンサー
    • Perl
  • (秀丸)正規表現で、特定文字列含む<~>範囲を選択

    お世話になります。 (秀丸の)正規表現について教えてください。 たとえば、テキストファイルに、1行、 ”<abc>文字列1です><abc>文字列2です><abc>文字列3です>(ここで改行)” という文字列が存在しています。 それを対象として、 (秀丸の)正規表現を利用し、 ”<abc>文字列2です>”だけをマッチさせたいのですが、 試しに、(秀丸の)正規表現で、 <abc.*文字列2.*?>  ←(なお、実際の記号は半角(.*?等)で、それぞれ入力しています・・・) で検索実行したところ、 ”<abc>文字列1です><abc>文字列2です>” として、 前の方に、マッチして欲しくない、 ”<abc>文字列1です>” までがマッチしてしまっている状況です。 そこでご質問なのですが、 上記におきまして、(秀丸の)正規表現を利用して、 ”<abc>文字列2です>”だけをマッチさせるには、 どのようにすれば、よろしかったでしょうか? (ちなみに秀丸は、2013年12月10日(火)現在の  最新バージョンVer8.32を利用しています) 以上になります。 宜しくお願いいたします。

  • 正規表現で特定の文字集団以外の文字列があるとマッチする書き方

    正規表現で特定の文字集団以外の文字列があるとマッチするというものです。"ABCDEFGHIJK0123456789"以外の文字が1つでもあればそれにマッチし、$1,$2...にそれらを格納する書き方が知りたいです。 たとえば、 "ACKL1-BZaF" なら、マッチして、そして $1にL $2に- $3にZa あと、正規表現の真髄は、よくNFA,DFAの違いがわかれば良いなど書いていますが、身近にこの違いがはっきるわかる事例ってありますか?

  • 正規表現の実行レポートは作成可能でしょうか?

    開発言語:Perl(Win32) ヴァージョン:5.8.4.810 perl.exeのプロパティー参照 長文の正規表現にパターンマッチを試みているのですが、 本来マッチするはずの文字列に対して、マッチしません。 しかし、正規表現が長文のため、なかなかデバッグが進みません。 どのように、パターンマッチが進んでいるか見ることが出来ればデバック作業が早くなると思うのですが、 私はその方法を知りません。 そこで、質問なのですが、Perlが正規表現をどのように解釈して、パターンマッチを進めているか、確認する方法はないのでしょうか? できれば、パターンマッチ実行中、解釈している位置と、文字列をレポートとして出力する方法があれば、それを知りたいと思います。

    • ベストアンサー
    • Perl
  • Perlで文字列の切り出しをするには?

    おせわになります。 Perlであるパターン間の文字列を取り出す方法はあるのでしょうか?例えば、"Monday<From>Thursday<To>Friday"という文字列の<From>~<To>間、つまり"Thursday"を取り出したいのですが、うまくいきません。 できればパイプでつないでいくために、以下のような正規表現でかければ最高なのですが… echo 'Monday<From>Thursday<To>Friday' | perl -e '○○○○' もう1週間以上ここではまっています。Perlってはまると長いです…

    • ベストアンサー
    • Perl
  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • 正規表現で特定文字列の全角カナと半角カナの両方を検索したいと思っています。

    正規表現で特定文字列の全角カナと半角カナの両方を検索したいと思っています。 たとえば リンゴ と リンゴ(半角カナ) にマッチする正規表現、ということです。 想定環境はWindowsXP Pro+秀丸7です。 意味不明でしたら加筆修正しますのでよろしくお願いします。

  • 正規表現を使った文字列の抽出方法について

    正規表現を使った文字列の抽出方法について RHELを使っています。 テキストデータの中に、以下のようなデータが 百万行単位で並んでいます。(カンマ区切り、2列構成) 1, 1.24425 2, 3.25252 (中略) 13, 6.25365 14, 8,36222 (中略) 103633, 252525.0 最終的にやりたいことは2列目のデータのみの抽出です。 考え方として、正規表現で 「<任意の文字列の連続><カンマ>」という文字列を認識させ、 それを「空欄」で置換したいと考えています。 文字列の最後の文字をマッチさせる指定子が「$」という情報をWebで見つけたので まず、grepで見つけられるか以下のようにやってみたのですが、 grep -i ",$" test.txt $が環境変数と取られ、構文エラーとなってしまいます。 使い方がおかしいのでしょうか? ちなみに、うすうす感じている疑問として、「$」は文末にくるものしかマッチしなかったり しますでしょうか? カンマ区切りなので、表計算ソフトを使えなくもないですが、 行数がExcel2007の限界をよく超えるので、それ以外の方法で考えています。 アドバイスよろしくお願いいたします。