- ベストアンサー
正規表現で文字クラスの引き算
_--_--_-_-の回答
.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 を得ることができると思います。 なお、この回答は全般的に「自信なし」です。
関連するQ&A
- VB2005で、正規表現を使いたい
VB2005で、正規表現を使いたいのですが、Basp21など使わずに.NET標準で備わっているPerl互換のようなものはありますか? VBで正規表現に詳しいサイトや書籍などありましたらご教授ください。
- ベストアンサー
- Visual Basic
- 秀丸の正規表現はどの流派に属しているのですか?
秀丸エディタ64 (バージョン8.20)を使用しています。 秀丸の正規表現は、どういった流派(?)の流れを汲んでいるのでしょうか?よく、○○互換の正規表現という言葉がありますよね。Perl互換、.NET互換など、、、Java、C、そのほかの言語/プラットフォームで秀丸の正規表現に最も近いのは何でしょうか、教えてください。
- ベストアンサー
- その他([技術者向] コンピューター)
- 正規表現のサンプル豊富なサイト
正規表現の素人です。 サンプル豊富なサイトで勉強させていただきたいのですが、適当なサイトをご紹介いただけないでしょうか。 #perlはわかりません。 #aspのコンポネントでperl互換の正規表現を利用するための勉強。 #aspも初心者レベル。
- ベストアンサー
- Perl
- 正規表現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
お礼
ありましたね、文字プロパティのユーザー定義! これで行けると思います。 #! 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}/ でバッチリです。 どうもありがとうございます!
補足
下のお礼の続きです。 文字プロパティが定義できることは知ってたんですが、マイナスで削除できるところは知りませんでした。 ややこしいですが便利ですね。 本当にありがとうございます。