言語:perl5.00404
機種依存文字である、ローマ数字を変換したいのですが、
例:ローマ数字の1~10を、I,II,III,IV,V,・・・と変換したい。
試みた方法としては、
&jcode::tr(\$str, "\xAD\xB5", "I");
&jcode::tr(\$str, "\xAD\xB6", "II");
&jcode::tr(\$str, "\xAD\xB7", "III");
&jcode::tr(\$str, "\xAD\xB8", "IV");
&jcode::tr(\$str, "\xAD\xB9", "V");
jcodeを使用して変換。
この方法だと、ローマ数字の1~3は、全て"I"としか
変換してくれず困っています。
(1文字目しか変換されないようなのです。)
これではいけないと考え、正規表現で以下のように試みたのですが、
$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;
$str =~ s/$eucpre(?:\xAD\xB5)$eucpost/$1I/g;
$str =~ s/$eucpre\Q\xAD\xB5\E$eucpost/$1I/g;
$str =~ s/$eucpre(?:\xAD\xB6)$eucpost/$1II/g;
$str =~ s/$eucpre\Q\xAD\xB6\E$eucpost/$1II/g;
$str =~ s/$eucpre(?:\xAD\xB7)$eucpost/$1III/g;
$str =~ s/$eucpre\Q\xAD\xB7\E$eucpost/$1III/g;
$str =~ s/$eucpre(?:\xAD\xB8)$eucpost/$1IV/g;
$str =~ s/$eucpre\Q\xAD\xB8\E$eucpost/$1IV/g;
$str =~ s/$eucpre(?:\xAD\xB9)$eucpost/$1V/g;
$str =~ s/$eucpre\Q\xAD\xB9\E$eucpost/$1V/g;
これだとperlのバージョンが対応していない(perl5.005以上だとできる)のでこの策もだめで、困り果てています。どなたかよい方法を教えてください。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
その正規表現による方法は、参考URLの「Perlメモ:正しくパターンマッチさせる」で紹介されているものですが、そこにはPerl5.005より前の環境でも利用可能な方法も載っていますので、そちらを参考にされるとよいでしょう。
参考URL:http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
ご回答ありがとうございます。
試みたのですが、不可解な現象にぶちあたりました。
【正常に動作】
$ascii = "[\x00-\x7F]";
$twoBytes = "[\x8E\xA1-\xFE][\xA1-\xFE]";
$threeBytes = "\x8F[\xA1-\xFE][\xA1-\xFE]";
$pattern = "(2)";
$replace = "II";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(3)";
$replace = "III";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(4)";
$replace = "IV";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(5)";
$replace = "V";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
【Internal Errorとなってしまう】
$ascii = "[\x00-\x7F]";
$twoBytes = "[\x8E\xA1-\xFE][\xA1-\xFE]";
$threeBytes = "\x8F[\xA1-\xFE][\xA1-\xFE]";
$pattern = "(1)";
$replace = "I";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(2)";
$replace = "II";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(3)";
$replace = "III";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(4)";
$replace = "IV";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
$pattern = "(5)";
$replace = "V";
$str =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1$replace/g;
ローマ数字の(1)を変換しようとするとエラーになってしまうのですが、なぜでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- 計算機科学 ディジタル信号の問題がわかりません 1 2022/05/11 21:12
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- 高校 高2数Bの質問です。 ベクトル PB+DS-PS-XB=DX を証明する問題です。 →は省略させて頂 2 2022/05/15 01:03
- Visual Basic(VBA) VBA ユーザーフォームからSubプロージャ―に値を引き渡す方法 3 2023/04/09 01:54
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6にも「ToString」ってあり...
-
世界測地系から日本測地系への変換
-
LINUX上でシリアル通信(C++)
-
2ちゃんねる用語 香具師ってな...
-
文字コードの%E3%80%とは何です...
-
【abc】に【完全一致】する正規...
-
正規表現 URL抽出「 [\\/\\b]{0...
-
大文字と全角文字は同じ意味で...
-
スペースで区切られた氏名から...
-
住宅にカナを入力する際に丁目...
-
エクセルで数値を全角文字(カ...
-
全角英数字の必要性が理解できない
-
日本語環境下でのバックスラッ...
-
エクセル:桁区切り「カンマ」...
-
差し込み印刷について教えてく...
-
全角チルダと波ダッシュに関す...
-
xmlファイル内の文字列置換
-
正規表現で、特定の文字列を含...
-
エクセルで電話番号を取り出す...
-
ExcelVBA バイナリファイルの全...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでPDFファイルをMicro...
-
CString から LPCTSTRの型に変換
-
文字コードの%E3%80%とは何です...
-
SJIS->UTF8->SJISコード変換に...
-
Visual Studio プロパティペー...
-
テキストをhtml変換するには
-
VBScript文字列をSJISからUTF8...
-
文字化けしてしまって困っています
-
LINUX上でシリアル通信(C++)
-
シャープ(#)の受け渡し
-
【PHP】全角記号を半角記号...
-
エクセルでの漢字(全角ひらが...
-
URLが日本語なのになぜ表示...
-
CString型からdouble型への変換
-
ファイル名の右側を変更したい ...
-
SQLのデータで半角カナを全角に...
-
Excelで半角カナのみを全角に変...
-
VB6にも「ToString」ってあり...
-
改行を含んだ文字列を正規表現...
-
日付をシリアル値に変換
おすすめ情報