• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現で文字クラスの引き算)

正規表現で文字クラスの引き算

_--_--_-_-の回答

  • ベストアンサー
回答No.3

.NET 正規表現とは違ったアプローチになりますが、一応あることはあります。 (.NET 正規表現互換も、package Something; use overload; sub import { overload::constant qr => \&substraction } sub substraction { #... } みたいなことをすればできるかもしれませんが――私はよく知りません) 本題に戻りますが、Unicode ブロック属性を用いれば目的は果たせると思います。 例えば: use utf8; print 1 if 'あ' =~ /\p{InHiragana}/; このように、\p{InHOGE} という形の文字クラス (と呼ぶのでしょうか) が utf8 プラグマの機能として (自信なし) 用意されています。 ちなみに、CJK 統合漢字の属性は \p{InCJKUnifiedIdeographs} だったと思います。 さらにこの属性を自分で作ることもでき: sub InKana { return <<'EOF'; +utf8::InHiragana +utf8::InKatakana EOF } まあこんな感じで、+ から始まる属性は追加、- から始まるやつは削除という風に定義できるらしいです。 応用すれば CJK から J を引いたクラスも作れると思います。 文字のバイト列を調べて平仮名かどうか調べる――といったテクニックの現代版と言えるのでしょうか。分かりません。 `perldoc perlunicode' で more details を得ることができると思います。 なお、この回答は全般的に「自信なし」です。

TYWalker
質問者

お礼

ありましたね、文字プロパティのユーザー定義! これで行けると思います。 #! perl # regtest.pl -- 正規表現のテスト while(<DATA>) { chomp; print "$_ matches /\\p\{p01256\}/\n" if /\p{p01256}/; } sub p01256 { return<<'EOF'; +0030 0036 -0033 0034 EOF } __DATA__ 0 1 2 3 4 5 6 7 8 9 => 0 matches /\p{p01256}/ 1 matches /\p{p01256}/ 2 matches /\p{p01256}/ 5 matches /\p{p01256}/ 6 matches /\p{p01256}/ でバッチリです。 どうもありがとうございます!

TYWalker
質問者

補足

下のお礼の続きです。 文字プロパティが定義できることは知ってたんですが、マイナスで削除できるところは知りませんでした。 ややこしいですが便利ですね。 本当にありがとうございます。

関連するQ&A

  • VB2005で、正規表現を使いたい

    VB2005で、正規表現を使いたいのですが、Basp21など使わずに.NET標準で備わっているPerl互換のようなものはありますか? VBで正規表現に詳しいサイトや書籍などありましたらご教授ください。

  • 秀丸の正規表現はどの流派に属しているのですか?

    秀丸エディタ64 (バージョン8.20)を使用しています。 秀丸の正規表現は、どういった流派(?)の流れを汲んでいるのでしょうか?よく、○○互換の正規表現という言葉がありますよね。Perl互換、.NET互換など、、、Java、C、そのほかの言語/プラットフォームで秀丸の正規表現に最も近いのは何でしょうか、教えてください。

  • MFCで正規表現

    Visal Studio 2005のC++で、MFCアプリとして、正規表現を行う簡単なプログラムを書きたいのですが、方法がわかりません。 できれば、perl互換が良いですが、MFCで一般的なものでかつ、 高速で正規表現の処理をさせたいので64bitでコンパイルしても問題ない ものが知りたいです。 ちなみにVBのRegExpとPerlで正規表現は使ったことがありますので、正規表現自体は多少知っております。 MFCでどのように記述するかが知りたいです。 よろしくお願いいたします。

  • VB6でPerl互換の正規表現を使いたい

    VB6でperl互換の正規表現を使いたいのですが可能でしょうか?

  • 正規表現が読めない

    諸般の事情でperlスクリプトに手を入れることになりました。 perlについてはまったくの素人であることに加えて、正規表現が読めません。お恥ずかしいのですが、下記を読み下していただけないでしょうか。 (変数のリスト) = map{/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); $tmpはカンマ区切りのテキストです。

    • ベストアンサー
    • Perl
  • 正規表現のサンプル豊富なサイト

    正規表現の素人です。 サンプル豊富なサイトで勉強させていただきたいのですが、適当なサイトをご紹介いただけないでしょうか。 #perlはわかりません。 #aspのコンポネントでperl互換の正規表現を利用するための勉強。 #aspも初心者レベル。

    • ベストアンサー
    • Perl
  • .NETで正規表現

    .NETで正規表現を使いたいのですが、Perl互換の正規表現を処理するサンプルが知りたいのですが、どうすれば良いのでしょうか? あと、.NETで全てを網羅している辞書みたいな書籍を探しているのですが知っている方教えてください。 .NETは名前空間を理解したら、OKというものでしょうか? 素人で申し訳ありません。

  • 正規表現eregとpreg

    pregがperl互換の正規表現というのは分かったのですが、eregとpregは使い分ける用途などがあるのででしょうか? あるhtmlから<a herf="--">タグを抜く作業に苦労していまして、調べるとどちらも使われているようで、正規表現を勉強するのにも戸惑っています。 せひ宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPで正規表現を使った対象データを全て取り出した

    PHPで正規表現を使った対象データを全て取り出したいのですが、 echo ($matches); にしても「Array」しかでないし、、 var_dump($matches); で確認しても意図するものが取れておりません。。 正規表現で取りだしたい箇所は hrefの「100065」と「100066」です。 これはテスト用に作っているので2個ですが、本来は 30個程度対象箇所があります。 何か正規表現の記述が間違っていると思いますが、ご指摘願います。。 ・プログラム preg_match_all( "(/abcNo=(.*?)&ckFlg/)", $_getHTML, $matches); var_dump($matches); ・var_dumpしたブラウザの表示内容 array(2) { [0]=> array(0) { } [1]=> array(0) { } } 補足: $_getHTML は既にダミーで用意したHTMLを読み込んだものです。 $_getHTML で読み込んでいるファイルの中身です。 <html> <body> <a href="abcNo=100065&ckFlg=1"></a> <a href="abcNo=100066&ckFlg=1"></a> </body> </html>

    • ベストアンサー
    • PHP
  • 正規表現について2

    すみません、前回「正規表現について」でお世話になりました者です。 前回の分は解決したのですが、それに関連してもう少し教えてください。 data.txt---------------------------------------- aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ test.pl----------------------------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); my $line=0; open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ if ($line++==0){ $output1="$1" if/aaa(.*?)ccc/;} s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); print $output1; ------------------------------------------------ とすることで、得られたい結果である、 output.txt-------------------------------------- bbb aaadddccc aaaeeeccc ------------------------------------------------ IEでの表示-------------------------------------- bbb ------------------------------------------------ となりました。そこで今回教えていただきたいのは、 data.txt---------------------------------------- <空行> aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ というようにdata.txtのはじめが空行の場合にも、 上記と同じような結果を得たいです。output.txtの はじめは空行になっても構いません。得られる文字として、上と同じ結果がほしいです。どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl