- ベストアンサー
行頭語による判別を含んだ、正規表現による置換
条件つきの正規表現がうまく組めず困っております。 以下のような条件で、テキストファイルを置換しようとしております。 置換 (1) 全角英数字を半角化 (2) 半角カナを全角化 (3) & , " などの記号を文字参照(&など)化 置換対象の種類は百程度あり、半角記号や全角機種依存文字など各種 警告 ・ 第三/四水準文字や、特定の文字コードの文字があれば警告 処理対象条件 A 置換対象のファイルは shift-jis B ファイル内には、機種依存文字、第三/四水準文字が含まれる C ファイル内の行が[en]から始まっていたら置換対象とする ファイル内の行が[ja]から始まっていたら別の置換条件で置換する D ファイル内の行が[lang=en]だったら、次の行を置換対象とする ファイル内の行が[lang=ja]だったら、次の行を別の置換条件で置換する 上記のような条件となっております。 当初、処理対象の条件がAとBだけだった時は、 ([0-9A-Za-z !”#$%&’()*+,-./:;<=>?@[¥]^_`{|} ̄]) → 半角化 (ガ|ギ|グ|ゲ|ゴ|ザ|ジ|ズ|ゼ|ゾ|ダ|ヂ|ヅ|デ|ド|バ|ビ|ブ|ベ|ボ|パ|ピ|プ|ペ|ポ|ヴ) → 全角化 などと一種類ずつ置換条件を書いて、置換と警告が出来ておりました。 しかしCとDの条件が追加されたため、うまくいかずに困っております。 ^(^ja-|^ja-)(.*?)([0-9A-Za-z !”#$%&’()*+,-./:;<=>?@[¥]^_`{|} ̄]+) このような抽出条件を書いたりしましたが、置換対象と非対称が何度も交互に出る場合などに対応できておりません。 なお、CとDを含まない条件下では以下のフリーウェアを利用して置換処理をおこなっております。 http://www.sirmiles.com/repl_ace/ 当初は Perl で開発しておりましたが、 ・ 第三水準文字などが入った時にファイル出力できなかったこと ・ 文字境界の問題か、全く同じ文字に対して置換できる場合とできない場合があったこと などにより上記フリーウェアの利用といたしました。 上記や処理対象条件のAが解決すれば、行頭語の判断は if 文のみでいけるのでPerlの芽もありだと思うのですが…… 現在調査を進めている方策は、以下3点です。 1 正規表現のみで行頭条件分岐+全置換の仕方を見つけて、これまで使っていたフリーウェアで実施。 2 現在は全く知識がないのだが、秀丸マクロでプログラムを組む (サブフォルダを含めファイルの一括処理、行単位での処理、行頭の判別、半角化や全角化などなど……) 3 第三水準文字などの扱いと、置換できる場合とできない場合の調査を行いPerlで開発 (優先順位としては 1>2>3 な感じですが、1は現在行き詰まり2で調査や試行錯誤中です) どなたか詳しい方にご意見・可否などいただければ幸いです。 時間もなく、日中もネットにつながらないために返信も遅いかもしれませぬが、よろしければお知恵をお貸しください。
- suzukiri
- お礼率100% (4/4)
- Perl
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1の方法で解決可能です。 そのソフトのドキュメントで言うとこのあたりの技術を使います。 http://www.sirmiles.com/repl_ace/readme/contents/regex_7.html 簡潔な例に置き換えますが 「ja-」で始まる行の小文字アルファベットを全て大文字にするなら以下の正規表現で対応します。 検索文字列:(?<=^ja-.*)([a-z]) 置換文字列:${CONV_Upper($1)} オプション:正規表現を使う、行モード 「lang=ja」の行の次の行の小文字アルファベットを全て大文字にするなら以下の正規表現で対応します。 検索文字列:(?<=^lang=ja\r\n.*)([a-z]) 置換文字列:${CONV_Upper($1)} オプション:正規表現を使う、行モード ちなみにPerl5系では(?<=)内に可変長のパターンが置けません。 そのソフトが使用している正規表現エンジンで運良く対応していたため実現できたという形です。
その他の回答 (1)
- ORUKA1951
- ベストアンサー率45% (5062/11036)
ひとつひとつスクリプトを示していくと膨大になるので、よくまとめられたサイトがありますので、それを参考にして書かれるのがよいでしょう。 なお、原則としてShift_JISのままでは正規表現がうまく行きませんので、Jcode.pm等で一旦UnicodeないしEUCに変換して処理してください。(EUCでも不正にマッチすることがある。) 【参考サイト】 Perlメモ/日本語の扱い - Walrus, Digit. http://digit.que.ne.jp/work/index.cgi?Perl%e3%83%a1%e3%83%a2%2f%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%81%ae%e6%89%b1%e3%81%84#ptrouble_code 【参考サイト】 Perl正規表現雑技 http://www.din.or.jp/~ohzaki/regex.htm 【参考サイト】 Perl正規表現雑技 http://www.din.or.jp/~ohzaki/regex.htm
お礼
>ORUKA1951様 ご回答ありがとうございます。 Perl で shift-jis のまま行った場合、機種依存文字や第三水準文字の箇所で 以下のようなエラーが出ておりました。 "\x{fffd}" does not map to shiftjis at jst_rep.cgi line 383. 置換後のファイルを shift-jis で、機種依存文字や第三水準文字も (置換対象でなければ)原文のままで出さなければなりません。 そのため、別の文字コードに変換してしまうと、機種依存文字などが元に 戻せないかと思いました。 (Perlメモ/日本語の扱い 相互変換できない記号 のページを参照しました) ご紹介いただいたページは、作業後に改めて勉強させていただきます。 現状では、とりあえず力押しでもなんとか置換処理を行わねばと思っております。
関連するQ&A
- 正規表現:囲われた文字列の置換
シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。 全角文字のみ 半角文字のみ 全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- 行頭を揃える方法
行頭の文字が揃わない時が結構あります。 その時は、 (1)、半角と全角のスペースを組み合わせて、1行目と2行目の行頭を揃える (2)、ルーラーで2行目を1行目に合わせる を行っています。 他に簡単に揃える方法ありますか?
- ベストアンサー
- その他MS Office製品
- 正規表現の置換(EmEditor)
Fireworksで書きだしたhtmlをEmEditorで修正中です。 name="●●●" を一括削除しようと正規表現を使った置換を試みていますが上手く出来ません。 検索する文字列に入れるサンプル文字を教えて頂けませんか。 ■検索したい文字列例(行頭に半角スペースあり) (半角スペース)name="c123_r4_c6" (半角スペース)name="c123_r5_c5" (半角スペース)name="c123_r6_c4" などです。 全てに共通するものは name=""、c123、_r、_c です。 4、5、6 の位置にある数字は変わります。 ■置換後の文字列 空白 (検索したい文字列の行頭半角スペースも削除) よろしくお願いします。
- ベストアンサー
- その他(業務ソフトウェア)
- Excel2000で置換>全角数字を半角数字へ
表記置換方法についてご教授ください。 ある列に文字列と全角数字が混在したセルが数百行あります これを半角数字に置換したいのですが希望通りにできません。よい方法をご存知の方ご教授願います 変換した内容 (TEL)03-9999-9999 ⇒ 03-9999-9999 半角 全角数字(実際には電話番号) 半角数字 やったこと 置換機能にてまず行頭の(TEL) を削除 置換にて0(全角)→0(半角) これを0~9まで10回繰り返し これを一度の置換で実行させたい 置換前の文字指定と置換後の文字を正しく指定する方法はないでしょうか?
- ベストアンサー
- オフィス系ソフト
- 正規表現による置換
HTMLの構文も正規表現もよく理解しないままに作業をしているので とんちんかんなことを言っているのかもしれません 合わせて指摘してもらえると助かります Yahoo pipes 使ってる中で発生している現象です 目的としては HTMLタグから一部の文字列を取り出したく 変換元のXTMLは以下のようなものです(一部加工しています(***** の部分は隠しています) <a rel="nofollow" target="_blank" href="http://*****.html">抽出したい文字列</a> <img alt="new" class="new" height="15" src="http://*****.jpg" width="32"/> に対して 置換対象 .*html">(.*) 置換後 $1 を行ってからさらに 置換対象 (.*)<img.* 置換後 $1 としたところ 一応抽出はできました 本来 2回目は (.*)</a の気がするのですが1回目の結果を見るとなぜか</a> の部分もなくなってしまっています これも不思議なのですが 2回に分けて行うのは面倒なので1度で行いたいと思い 置換対象 .*html">(.*)<img.* 置換後 $1 としてみたのですが 求めている文字列の抽出をすることができませんでした .一応 *html">(.*)</a.* というのもやってみましたが結果は変わりませんでした これは当然の結果ななのか変換(処理)ツールの不具合なのかの判断ができません 分かる人がいたら教えてもらえないでしょうか 情報足りなければ補足させていただきます
- ベストアンサー
- その他(ソフトウェア)
- 正規表現置換
はじめまして。 現在、テキストエディタで kami987koroです。(漢字、かな、英数字、半角記号、全角記号、改行、スペースを含む文字列)ありがとうございました。 という文字列を正規表現で拾いだして、置換したいと考えています。 ただ、私がその方面の知識に疎く、どう表記すればよいのか分かりません。 そこで、この分野にお詳しい方、ご教授願えませんでしょうか? よろしくお願い致します。
- ベストアンサー
- その他(業務ソフトウェア)
- 秀丸エディタの正規表現
秀丸エディタの正規表現 これから述べる置換処理について教えてください。 条件を表現します。 まず半角空白文字を _ このように全角アンダースコアであらわします。 そしてマッチさせたいSTRINGは _ このように半角空白文字がそれ以外の文字に前後をはさまれている状態ではなくて、 、 __ このように半角空白文字二個もしくは二個以上続いたものが半角空白文字以外に挟まれているパターンです。 。 ちなみに置換後の文字列は __ ですつまり空白半角文字列二個です。 よってこの質問は次のようにも言い換えられます。 。 検索文字列 半角空白文字二個以上 を置換後文字列 半角空白文字二個に置き換える。もしくは、半角空白文字三個以上を 置換後文字列 半角空白文字二個に置き換える。 というのが質問です。おねがいします。 すみませんつけたしです。上記を実現する正規表現を教えてください。
- ベストアンサー
- 数学・算数
- 正規表現で置換
正規表現の初心者です。 テキストエディタを使って、「@:」で始まる以外の行の先頭に「//」を挿入してコメントアウトしたいのですが、正規表現がうまく書けません。 検索対象: ^[^(@:)] 置換文字列: // でいいのかなと思ったのですが、[]の中ではグルーピング用の()も文字として認識されてしまうのですね。 どのように書いたら正しく置換されるでしょうか。 どうかご教示ください。
- ベストアンサー
- その他([技術者向] コンピューター)
- Dreamweaverの置換(正規表現)
あるHTMLファイルで、2バイト文字の中にある半角スペースを削除したいとき、秀丸で開いて、 検索:\f[ -黑]\f \f[ -黑]\f 置換:\0\1\2\3 としたらちゃんと置換されました。 (文字化けしてるかもしれませんが、IMEパッドの文字一覧の一番最後の漢字です) 同じ事をDreamweaverで処理する事は可能でしょうか?可能な場合、どのように設定すればよいのでしょうか?
- 締切済み
- ホームページ作成ソフト
- 正規表現、置換について
ファイルから読み込んだ行データを置換したいのですが どういう正規表現にすればよいかご教示下さい。 【置換対象】 testをXXXにしたい ただし、文字列中の後方一つ目のみを置換したい。 【データ】 c:/test/ctestab → c:/test/cXXXab c:/testctest → c:/testcXXX c:/testtesta → c:/testXXXa c:/testtest → c:/testXXX c:/test → c:/XXX
- ベストアンサー
- その他(プログラミング・開発)
お礼
>yuuki0229様 ご回答ありがとうございます。 (?<= ですと1度マッチした後にも、同一行内で再び行頭が一致しているかどうかを条件とするんですね。 自分で調べた時は何度も交互に出る場合に対応できず、いっそ置換処理を何度も連打しようかと考えておりました。 お教えいただいた書式を元に、今回の置換内容にあわせて設定ファイルを作成中です。 非常に助かりました。どうもありがとうございました。