お世話になります。
正規表現の文字クラスについてお聞きします。
0~6 の数字1字を [0-6] という風に指定しますが、
.NET 正規表現では、
この中から 3~5 は除く、というようなとき、
[0-6-[3-5]] と言う風に書けるようですが、
Perl では書けないようです。
(一応ラクダ本と perldoc perlre には当たりました)
#! perl
# regtest.pl -- 正規表現のテスト
while(<DATA>) {
chomp;
print "$_ matches /[0-6-[3-5]/\n" if /[0-6-[3-4]/;
}
__DATA__
0
1
2
3
4
5
6
7
8
9
のようなスクリプトを動かすと、
C:\test>regtest.pl
0 matches /[0-6-[3-5]/
1 matches /[0-6-[3-5]/
2 matches /[0-6-[3-5]/
3 matches /[0-6-[3-5]/
4 matches /[0-6-[3-5]/
5 matches /[0-6-[3-5]/
6 matches /[0-6-[3-5]/
のような結果が得られ、引き算が確かに聞いていません。
Perl と .NET 正規表現は互換ではないのでしょうか。
また、Perl でも同じことが書けるでしょうか。
よろしくご教示願います。
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 を得ることができると思います。
なお、この回答は全般的に「自信なし」です。
この回答への補足
下のお礼の続きです。
文字プロパティが定義できることは知ってたんですが、マイナスで削除できるところは知りませんでした。
ややこしいですが便利ですね。
本当にありがとうございます。
ありましたね、文字プロパティのユーザー定義!
これで行けると思います。
#! 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}/
でバッチリです。
どうもありがとうございます!
No.2
- 回答日時:
0~2と6なら [0-26] と書きます。
> Perl が機能の豊富さで他の言語に負けるのはめずらしいケースなので、
そもそも、Perlは正規表現を実装している言語の中では古い方です。
現在、正規表現に対応している言語の大半はPerlの正規表現を参考に
作られています。
(そのため、Perlの正規表現互換の記述である場合が多いです)
一方で、古いために新しい要求などがでてきても仕様が古いために
対応されていません。
新しい言語ではその辺を独自に改良している場合があります。
しかし、お書きになっているような書き方よりPerlのような書き方の
方がずっと簡単でシンプルだと思いますが...。
ありがとうございます。
たぶん見方が違うんだと思うんですが、Perl の正規表現はだらしないほど拡張しまくっているように思えます。
たとえば (?<=PATTERN) のような文字を消費しないパターンとか、パターンを再帰させてカッコの対応にマッチさせるようなのは、昔なかったような? 気がします。
とまれ、確かに、上の書き方はシンプルではありませんね。
状況を説明すると、.NET と Perl で同じ処理を書いていて、.NET で書いた人がくれたパターンが Perl で動かなかったという感じです。
マーその作業の体制が???という話はあるんですが・・・(^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- オープンソース csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい 3 2022/09/02 15:17
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- その他(コンピューター・テクノロジー) 正規表現の置換で数値を合計したいです。 2 2022/10/17 11:01
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Java この世で連日正規表現について質問している阿呆は私くらいしかいないでしょう。本当にお世話になっています 2 2022/05/22 11:59
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/02/10 11:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
vbaの正規表現で、マッチした一...
-
正規表現で特定文字列の全角カ...
-
さくらエディタでGrep検索する...
-
MFCで正規表現
-
メールアドレスの正規表現について
-
C言語にパターンマッチってない...
-
wikiの差分表示
-
文章中全ての半角カッコ ( の...
-
wordの何も書かれていない2ペー...
-
PS4コントローラーをPCでゲーム...
-
エクセルでアルファベットか数...
-
Chr(13)とChr(10)の違いは?
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
EBCDIC⇒SJIS変換の方法
-
詳しくないので、どなたかお教...
-
Excelで3E8を3.00E+8にしない方...
-
セル内の文字列が日本語か英語...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
正規表現でAND検索はできる...
-
vbaの正規表現で、マッチした一...
-
文章中全ての半角カッコ ( の...
-
メールアドレスの正規表現について
-
正規表現です。括弧内にある複...
-
Perl 数値にスラッシュを入れる...
-
[正規表現] 数字範囲をヒット...
-
正規表現でシングルクォーテー...
-
[VBS] テキストファイルから任...
-
C言語にパターンマッチってない...
-
MFCで正規表現
-
Mで始まりuで終わる文字列
-
正規表現でカウントアップ(?)す...
-
C言語のコメントを「正規表現」...
-
grepの正規表現での最短マッチ...
-
正規表現で囲まれた部分の文字列
-
第二水準漢字が含まれるか?
-
特定タグ以外を変換したい
-
1行~複数行をまとめる正規表現
おすすめ情報