
条件つきの正規表現がうまく組めず困っております。
以下のような条件で、テキストファイルを置換しようとしております。
置換
(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で調査や試行錯誤中です)
どなたか詳しい方にご意見・可否などいただければ幸いです。
時間もなく、日中もネットにつながらないために返信も遅いかもしれませぬが、よろしければお知恵をお貸しください。
No.2ベストアンサー
- 回答日時:
1の方法で解決可能です。
そのソフトのドキュメントで言うとこのあたりの技術を使います。
http://www.sirmiles.com/repl_ace/readme/contents …
簡潔な例に置き換えますが
「ja-」で始まる行の小文字アルファベットを全て大文字にするなら以下の正規表現で対応します。
検索文字列:(?<=^ja-.*)([a-z])
置換文字列:${CONV_Upper($1)}
オプション:正規表現を使う、行モード
「lang=ja」の行の次の行の小文字アルファベットを全て大文字にするなら以下の正規表現で対応します。
検索文字列:(?<=^lang=ja\r\n.*)([a-z])
置換文字列:${CONV_Upper($1)}
オプション:正規表現を使う、行モード
ちなみにPerl5系では(?<=)内に可変長のパターンが置けません。
そのソフトが使用している正規表現エンジンで運良く対応していたため実現できたという形です。
>yuuki0229様
ご回答ありがとうございます。
(?<= ですと1度マッチした後にも、同一行内で再び行頭が一致しているかどうかを条件とするんですね。
自分で調べた時は何度も交互に出る場合に対応できず、いっそ置換処理を何度も連打しようかと考えておりました。
お教えいただいた書式を元に、今回の置換内容にあわせて設定ファイルを作成中です。
非常に助かりました。どうもありがとうございました。
No.1
- 回答日時:
ひとつひとつスクリプトを示していくと膨大になるので、よくまとめられたサイトがありますので、それを参考にして書かれるのがよいでしょう。
なお、原則としてShift_JISのままでは正規表現がうまく行きませんので、Jcode.pm等で一旦UnicodeないしEUCに変換して処理してください。(EUCでも不正にマッチすることがある。)
【参考サイト】
Perlメモ/日本語の扱い - Walrus, Digit.
http://digit.que.ne.jp/work/index.cgi?Perl%e3%83 …
【参考サイト】
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- 高校 変数置き換えにつきまして 6 2022/05/01 16:44
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- PHP PHP・Wordpress preg_replaceを条件分岐で処理させる方法が知りたい 1 2023/05/01 14:25
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- フリーソフト サクラエディタの正規表現(grep機能)の使い方 3 2022/06/22 10:29
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 置換文字がみつからない時
-
正規表現で式展開を教えてくだ...
-
Excel VBA リストに一致したデ...
-
csvデータのダブルクォーテーシ...
-
csvデータ ダブルクォーテ...
-
正規表現でURLを抽出したいと思...
-
PerlでUTF-8のファイルの文字列...
-
スペースで区切られた氏名から...
-
複数のパワーポイントファイル...
-
秀丸マクロで列ごとに一括置換...
-
GoogleAppsScript文字列置換の...
-
正規表現でテキストの中身を置...
-
秀丸エディタで、「-」や「ー」...
-
EXCELマクロを用いてグラフの系...
-
\\(円)記号を置換したい
-
マッチした回数を知るには
-
AppleScriptファイルの読み書き...
-
秀丸の正規表現用DLLをDelphiか...
-
EXCEL警告「置換対象のデータが...
-
改行を正規表現での置換のあと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 置換文字がみつからない時
-
正規表現で、特定の文字列を含...
-
各項目がダブルクォーテーショ...
-
csvデータ ダブルクォーテ...
-
スペースで区切られた氏名から...
-
C言語でテキストファイルの内容...
-
○文字目に文字挿入
-
秀丸エディタで、「-」や「ー」...
-
csvデータのダブルクォーテーシ...
-
Excel VBA リストに一致したデ...
-
テキストボックスの文字列を置...
-
EXCELマクロを用いてグラフの系...
-
ハングルを日本語に置換
-
3回以上の改行を2回にする正...
-
C#で空白行を削除する方法
-
word VBA 改ページの繰り返しに...
-
フォントの色を保持したままセ...
-
xmlファイル内の文字列置換
-
正規表現 特定の文字列を含む行...
-
EXCEL VBA でCTRL+Fのダイア...
おすすめ情報