• ベストアンサー

謎の半角■文字を正規表現で文字を置き換えたい

よくCookiesのファイルで、半角の黒い■の文字があると思いますが、そのような文字を消したい為に、おそらく改行だろうということで $text =~ s/\n//g;としました。 それで、大部分は消せたのですが、それでも残っているのがあります。 他に考えられる制御文字はなんでしょう。 また、先の構文に当てはめるとs/の後になんと記述すればよいのでしょう。

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

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

  • ベストアンサー
  • papy-x
  • ベストアンサー率44% (12/27)
回答No.1

>\W 単語キャラクターでないものにマッチします これでどうでしょうか?

参考URL:
http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html
souta_n
質問者

お礼

教えていただいた\Wでやったというより、ご紹介のURLを参考にして原因がわかりました。不明な制御文字の正体はキャリッジリターンでした。 ありがとうございました。

その他の回答 (2)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.3

ANo.2の補足です。 Windows環境では、バイナリエディタで見ると「0A」(LF)だった、という説明が抜けていました。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

バイナリエディタで見ると「0A」(LF)ですね。 「\n」が「0A」に該当するかどうかは、UNIX系とWindows系で違います。 $text =~ s/\x0A//g; と書けば良いかと思います。

souta_n
質問者

お礼

原因がわかりました。不明な制御文字はラインフィールドではなくキャリッジリターンでした。 VBとかで改行プログラム書くときにvbcrlfつまりキャリッジリターンラインフィールドとしますが、そういう状態だったのです。\nだとラインフィールドだけ消すことになりキャリッジリターンの制御文字は残ってしまうのです。 これを消す為に $text =~ s/\r//g;を追加して解決しました。 ありがとうございました。

関連するQ&A

  • CGIで受け取った日本語文字列を正規表現で

    perlでcgiを作っています。 テキストボックスに入れてもらった文字列から正規表現で数字を抽出します。 以下のように、組むと "USA"のような半角英数はただしくマッチしますが、 "アメリカ"や"ドル"などはマッチしません。簡単に解決する方法をお教えください。 my $text = $in_data{'data_text'}; $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; if ($text =~ /USA (\d+) dollars/){ print "USA $1\n"; } if ($text =~ /アメリカ (\d+\.\d+) ドル/){ print "アメリカ $1\n"; } exit;

    • ベストアンサー
    • Perl
  • 半角文字を含むテキストの整形について

    ファイルの中身が「abcCLEてすと」という文章のファイルをopenして、 $text = "abcCLEてすと"  になるように代入し、そこから「abc」を削除して 「CLEてすと」という文にしようと思い、 $text =~ s/a|b|c//g; print "結果:$text\n"; のようなプログラムをつくり、結果を表示すると 「結果:bkEてすと」 と表示されてしまいます。 abcはうまく削除されているようですが、他の文字が変化してしまっているようです。 関係ない文字を変化させない為には、どうすればいいでしょうか?

  • 正規表現について

    任意の文字は「.」であらわされるようですが、とほほさんのサイトによると、\nは除いた任意の文字とあります。\nも含んだ任意の文字はどう表現すればいいのでしょうか? .|\n でいいんでしょうか? テキストファイルを$dataに読み込み、<start>と<end>にはさまれた改行を含む文字列を取得しようと、 if($text =~ /<start>(.*)<end>/){  print $1; } としたのですが、if文に引っかかりません。さらに、 if($text =~ /<start>([.\n]*)<end>/){  print $1; } かな?と思いましたがこれもできませんでした。 何かいい方法はないでしょうか?

    • ベストアンサー
    • Perl
  • perl cgiで正規表現が無限にマッチする

    perl でcgiを作っています。フォームから受け取ったテキストから、正規表現を用いて、データを切り出そうと思っています。 以下のようなコードを書くと、マッチするのは一か所だけのはずなのに、無限回数マッチしてprintしつづけます。なにが間違っているのでしょうか。ご指導ください。 my $text = $in_data{'data_text'}; #フォームから受け取る $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; # invalidation $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; while ( $text =~ /Line(\d{1}):長さ:(\S+) km/){ print "Line$1: $2<br>"; }

    • ベストアンサー
    • Perl
  • 改行や、タブを含む正規表現の方法

    HTMLからある部分抜き出す時、 たとえば、あるソースから <title>なんたら</title> という言葉を抽出する場合、 $htmlに全ソースが格納されていると仮定して 単純な正規表現で preg_match('/<title>なんたら</title>/', $html, $matches); といえれると、"<title>なんたら</title>"という文字が出せます。 ところが <title>   なんたら </title> のような改行やらタブが含まれていると抜き出すことができませんでした。 いろいろ調べますと、文字エスケープシーケンスというものがあり \nは改行 \tタブと書いてあるサイトがありましたので preg_match('/<title>\n\tなんたら\n</title>/', $html, $matches); という風に記述してみました。 しかし、それでも改行とタブの含まれた<title>から 文字を抜き出すことはできませんでした。 改行とタブの含まれた<title>から 文字を抜き出すには、どのような記述をすれば良いのか ご指導お願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現についてお教え下さい

    正規表現についてお教え下さい。 )以外の全ての文字列(改行・Tab・空白等含む)の1回以上の繰返しという記述は正規表現ではどのような記述になるでしょうか? NoEditorで下記のような条件でgrepしようとしたのですがうまくいきません。 [[^[^\)]] \t\n\r\f]+ 具体的には下記のような5行があった場合、以下のような条件で1、2、3行目を抽出できるということを想定しています。 条件:AAA )以外の全ての文字列の1回以上の繰返し \) ※現状の条件の記述はAAA[[^[^\)]] \t\n\r\f]+\) 1行目 AAAあ(aaa) 2行目 AAA あ(aaa) 3行目 AAA あ 4行目 (aaa) 5行目 AAA)

  • 全角・半角が混じったテキストで20文字毎に改行を入れたい

    perl5.8.5でCGIのプログラムを作っています。 全角・半角が混じったテキストで20文字毎に改行を入れたいと思っています。 プログラムの文字コードはEUCで書いています。 (変換前)12345678901234567890123456789012345678901234567890    ↓ (変換後)12345678901234567890\n12345678901234567890\n1234567890 という感じです。 いろいろな方法で実現できると思ったのですが スマートな書き方を教えていただけますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • JSP内の正規表現で、行先頭の/文字の意味は?

    お世話になります。 JSP内で、以下の正規表現で、文字列の行先頭と行末尾の 半角スペースを、置換を利用してTrim機能を実現しています。 var obj1 = document.getElementById("chaText").innerText; var obj1b = obj1.replace(/^\s+|\s+$/g, ""); document.getElementById("chaText").innerHTML = obj1b; そこでご質問させてください。 上記2行目において、 obj1.replace(/^\s+|\s+$/g, ""); という置換を実施していますが、 このreplace引数文字列の1文字目である /(スラッシュ)文字の意味を教えてください。 (他の各文字列につきましては調べが付きましたが、  この/(スラッシュ)文字を、ここに記述している意味だけが  不明の為・・・) 以上になります。 よろしくお願い致します。

  • 正規表現の置換で、カンマで区切られた語句を""と改行で分ける方法

    正規表現による置換についてお教えください。 Unixのコマンドで置換するときに、sed コマンドを使うと思います。 今、プログラムのソースコードの中に含まれている語句を取得するために、色々いじろうと思っています。 私が最もお聞きしたいのは、正規表現の書き方であることを、まずご理解ください。 ソースコードの中に、 string headline="語句1,語句2,・・・,語句n-1,語句n"; というように、 string headline= で始まっていて、 その後に " "(ダブルクォーテーションの組)で囲まれた部分が1箇所あり、 その部分に、カンマ(,)で区切られた語句がいくつもあるような行があったとき、 その " "の部分を、 "語句1", "語句2", ・・・ "語句n-1", "語句n" のように置換したいのです。 つまり、語句一つ一つをダブルクォーテーションで包んで、1行に語句が1つになるようにしたいのです。 厳密に言えば、stringとheadlineの間などに、タブや空白がいくつあるかわからないという問題なども考える必要があるかもしれません。 とりあえず私が考えたのは、 s/\(string headline="\)\([^,]\)+,\(";\)/\1\2",改行"\3/g です。 s/置換前の文字列のパターン/置換後の文字列のパターン/g となっています。 置換前のパターンで \( \) で囲まれている部分は、置換後のほうで、\1のように参照できます。 ■■でも、私の書いたものって、語句が繰り返し出現することに対応できていないように思われます。■■ 実際に、置換に改行を含めるには、正規表現をファイルの中に書いて、sedの-fオプションで読み込ませることになると思います。 string headline=" " という形をしていないものは、たとえ、" " の中がカンマで区切られていてもそれを分けません。

  • Macintosh環境でテキスト文字 \ を認識する方法を教えて欲しいです

    Macintosh環境において、S-JISフォーマットの、テキストファイル text.txt を読み込み、テキストで記述された改行コード変換するactionスクリプトを考えたいと思っております。 そこで、以下のようなスクリプトをつけたムービークリップを作りました。 onClipEvent (load) {   // テキストファイルの読み込み   System.useCodepage = true;   this.loadVariables("test.txt"); } on (release) {   // 改行文字を認識してメッセージに改行を追加   str = new String(text);   str = str.split(String.fromCharCode(92,110)).join("\n");   str = str.split(String.fromCharCode(92,114)).join("\n");   str = str.split("\\n").join("\n");   str = str.split("\\r").join("\n");   _root.DOCS= str; } 用意したtext.txtの内容は以下の通りです: &text=この先にnの改行があります\nこの先にrの改行があります\r¥¥n→\\n  ¥¥r→\\r& これを実行してみたところ、 ・Windows環境(FLASH7 & FLASH8)では_root.DOCSは以下のように表示されました: この先にnの改行があります この先にrの改行があります ¥¥n→\   ¥¥r→\ ・Macintosh環境(FLASH7 & FLASH8)では_root.DOCSは以下のように表示されました: この先にnの改行があります\nこの先にrの改行があります\r¥¥n→\\n  ¥¥r→\\r どうもMacintosh環境では、テキストの \ の認識が、split命令内では String.fromCharCode(92) や "\\" では認識しないのではないかと考えております。 この動作をMacintoshで実現する為には、どのように表記すればよろしいでしょうか。 良い案をおもちの方がおられましたら、是非御教授御願いできませんでしょうか。 よろしく御願い致します。

    • ベストアンサー
    • Flash

専門家に質問してみよう