正規表現の記述で、m{}と書くサンプルを目にしたのですが、このmと中括弧は何を意味するのでしょうか?

以下、Hタグにマッチするかをテストする正規表現のサンプルです。
$_ = "<H3>ヘッダ3</H3>";
if ( m{<(H\d)>(.+)</\1>} ) {
print "found!!";
}

A 回答 (1件)

「m」は正規表現マッチで、


通常の /・・・・/ と基本的に同じ働きです。
違うところは、mの後に非英数字や各種括弧(), <>, {}, []を使って、
正規表現を括ることができることです。
すなわち、
 /abc*/
 m#abc*#
 m{abc*}
などは、全部同じ意味です。
スラッシュがたくさんはいる正規表現を書くときなど、いちいちエスケープしなくて良いので便利、ですね。
    • good
    • 0
この回答へのお礼

YAMAMAYA様、回答ありがとうございます。

m//の区切り文字は、##や{}や<>や()に変えられるということですね。
初めて知りました。

スラッシュが含まれる正規表現を書く場合は、たしかに分かりやすいですね。

お礼日時:2007/02/08 13:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qphpの正規表現でカタカナ+スペース+カタカナ

phpの正規表現で全角カタカナ+全角スペース+全角カタカナ
というパターンを取り出したいのですが、
上手く取り出すことが出来ずに困っております。

どなたかご教授ください。
よろしくお願いいたします。

Aベストアンサー

<?PHP
$str="あい うえアイ ウエあい ウエ オカ キク ケコ";
$pattern="/[ァ-ンー]+ +[ァ-ンー]+/u";
preg_match_all($pattern,$str,$matches);
print_r($matches);

みたいなかんじ(UTF8限定)

Qwhile(<ハンドラ>) {} で行数をカウント

こんにちは。

掲示板をperlで作るという課題に取り組んでいるのですが、下記の部分の
動きだけがどうしても期待する動作がえられず、困っています。
なにか試した方が良い事がありましたら、ご指摘いただけないでしょうか。

プログラムの説明:
POST されたコメントを data.dat に追記していくプログラムです。
ファイルハンドラから一行づつ読み込んで、行数を $count でカウントし、
『X行目&&コメント』のようにコメントの先頭に行数を表示します。


#!/usr/bin/perl
$myfile = 'data.dat';

(省略)

sub piyo{
open(HOGE, ">> $myfile");
flock(HOGE, 2);
my $count = 1;
while(<HOGE>){
$count++;
};
print HOGE "$count行目&&in{'comment'}\n";
close(HOGE);

};


data.dat の期待する結果は下記です。

1行目&&コメント
2行目&&コメント
3行目&&コメント
.....

実際に data.dat に書き込まれた結果は下記でした。

1行目&&コメント
1行目&&コメント
1行目&&コメント
.....


試した事1:
open(HOGE, ">> $myfile");

open(HOGE, "+>> $myfile");
した。

試した事2:
while(<HOGE>){
$count = $count + 1;
};
とした。


どちらでも結果に違いがありませんでした。


よろしくお願いします。

こんにちは。

掲示板をperlで作るという課題に取り組んでいるのですが、下記の部分の
動きだけがどうしても期待する動作がえられず、困っています。
なにか試した方が良い事がありましたら、ご指摘いただけないでしょうか。

プログラムの説明:
POST されたコメントを data.dat に追記していくプログラムです。
ファイルハンドラから一行づつ読み込んで、行数を $count でカウントし、
『X行目&&コメント』のようにコメントの先頭に行数を表示します。


#!/usr/bin/perl
$myfile = 'data.dat';

(省略)

sub pi...続きを読む

Aベストアンサー

+>>をご使用なので、ファイルハンドラが最後に移動してないでしょうか。
ハンドラが最後に移動しているので、whileは実行されておらず、常にファイル末尾に1行目が出力されるというシナリオを想像します。

Perlfaqを使用して…

$lines = 0;
$filename = "yahho.txt";
open(FILE, "+<$filename") or die "Can't open `$filename': $!"; #open に+<を使用
while (sysread FILE, $buffer, 4096) {
$lines += ($buffer =~ tr/\n//);
print "p";
}
print FILE ++$lines . "やっほ~\n";

注意 open時にファイルの存在は保証してください。存在しない場合エラーです。

Q正規表現 .+? について

正規表現(egrepコマンド)の .+? とはどのようなパターンを意味するのでしょうか。
例1のケース(.+? の部分)が何故マッチするのかがわかりません。
また、例1, 2のケースは共にマッチしますが、
.+? と .*? の違いは何になるのでしょうか。

例1.
echo "tmp/foo.txt" | egrep "tmp.+?/.+?foo[^/]*$"

例2.
echo "tmp/foo.txt" | egrep "tmp.*?/.*?foo[^/]*$"

Aベストアンサー

「?」はPOSIXを含むいわゆる正規表現では0か1回マッチするという意味です
({0,1}とほぼ同意)
最短マッチに使うのはPerl互換ですね

「tmp.+?/」は「tmpに続く『何か1文字以上の文字』が『0回または1回』出現する」
なので「tmp/」にマッチすると考えられます

Q文字コードについて \x{53d6}表記法?

Perl5.8を使っています。
下のプログラムを実行すると、「取得」と表示されますが、この逆で"取得"文字列から、 \x{53d6}\x{5f97}を求めたいです。

また、\x{53d6}は バイトオーダー無しのUTF8の数値という意味でしょうか?


use utf8;
use encoding "shiftjis";

print "\x{53d6}\x{5f97}";
# 取得と表示されますが、この逆で"取得"文字列から、 \x{53d6}\x{5f97}を求めたい。

# \x{53d6}は バイトオーダー無しのUTF8の数値という意味でしょうか?

Aベストアンサー

こんな感じ
---------------------------------------------------------------
use encoding "shiftjis";
use Encode;
print "\x{53d6}\x{5f97}\n";

$text="取得";
print "$text\n";
$data=Encode::encode("UTF-16LE",$text);
for $x (unpack("S*",$data)){
printf("\\x{%04x}",$x);
}
----------------------------------------------------------------
># \x{53d6}は バイトオーダー無しのUTF8の数値という意味でしょうか?
UTF8ではなくてUnicode(コード)

Q正規表現 .+? と .++ と .+ の違いについて

正規表現でタグを除こうと思っています。
最初は任意の一文字の連続として
<.+>でうまくいくと思ったのですが、これだと
すべて取り除かれてしまいます。
何らかの一文字(の連続)が連続するとして、
<.++>としましたがこれだと何もマッチしません。
いろいろ調べて、
<.+?>だとうまくいきます。
なぜ最後のだけうまくいくのかよくわかりません。
最初の<.+>でうまくいけばわかりやすいのですが。
なにかアドバイスがありましたらお願いします。

Aベストアンサー

どの正規表現を使用していますか。(perl,sed,等)
それとも、Cのプログラムから正規表現ライブラリを使用しているのでしょうか。(C&C++のカテゴリへの投稿なので)
正規表現にも方言がありますので、まず、どの正規表現
をしようしているかを提示して下さい。(できればOSも。)
また、やりたいことは
<...任意の文字列...> を
両端の<>をとって
...任意の文字列... にしたいということでしょうか。

QData::Dumper;でダンプ後表示した文字列\x{30fc}...

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rss = new XML::RSS;
#表示形式の違いで1と2がある。
$Data::Dumper::Indent = 1;
use open IN => ":utf8"; # 入力をUTF8とする
use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
#use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#binmode STDOUT, ":encoding(euc-jp)";
#use open ":encoding(shiftjis)";

# rssをセット。
open my $fh, '< ./test.rss';
my $text = join undef, <$fh>;
close $fh;

# rssをパース
$rss->parse($text);

# ひとまず中見を知る為にダンプしてみる
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "<html><head>\n";
print "<title></title></head>\n";
print "<body>\n";
print Data::Dumper->Dump([$rss]);

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rs...続きを読む

Aベストアンサー

#1さんと同じですが
use encoding 'utf-8', STDOUT => 'Shift_JIS';
を始めにつける

$out_text = Data::Dumper->Dump([$rss]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
だけでいいと思います。

Q「半角数字」と「+」を許可する正規表現の書き方

「半角数字」と「+」(半角プラス)を許可する正規表現を書きたいです。


検索していて
このような電話番号のチェックはよく見掛けます。

preg_match('/^\d{2,5}-?\d1,5}-?\d{3,5}$/', $tel)



今回は、下記のデータを許可したいです。

1+
1254+
21+1000+
5154+45+987+201+

桁の指定は不要で、+の後ろには数値が無い場合もあります。
「+」は数字の後に必ず付いてきます。

宜しくお願い致します。

Aベストアンサー

こんな感じで

<?php
$sample=array(
"1+","1254+","21+1000+","5154+45+987+201+" //OK
,"111" //数字だけ
,"+" //プラスだけだけ
,"+222+333+" //先頭がプラス
,"444+555" //最後がプラスじゃない
,"66-7+888+" //数字プラス以外を含む
);
$pattern="/^(\d+\+)+$/";
foreach($sample as $val){
print $val."=&gt;";
print preg_match($pattern,$val)?"OK":"NG";
print "<br>\n";
}
?>

Qpush(@array, {}); について

いつもお世話になります。
いまperlのプログラムを読んでいるのですが、
push(@array, {}); 
という記述があり@arrayという配列の最後に値を追加しているというのはわかるのですが、どんな値なのか、つまり{}の意味がわかりません。スペースでしょうか?
よろしくお願いいたします。

Aベストアンサー

基本的にはperlの配列は一次元のスカラーなデータしか持てませんので、この場合は無名ハッシュのリファレンスと言うことになります。

配列の要素へのアクセスは[]を使いますよね。
$a[2]
みたいな感じです。これと同じようにハッシュは
$a{'abc'}
みたいな感じで使います。

つまり[]は配列、{}はハッシュです。
この場合{}の前に何も名前がないので無名ハッシュとなります。

それで配列の要素はスカラーなので無名ハッシュのリファレンスと言うことになります。

何かを初期化するためのものでしょうか?
ちなみにperlはCなどとは違い初期化していなくてもいきなり使えます。しかしわたしはわかりやすいようにあえて明示的にこのように初期化するのが好きですが。

この例だと

push(@array, { 'abc' => 'ABC' });

こんな感じで使うと、

$array[0]->{'abc'} は ABC となります($array[0]{'abc'}でも構いません)。

将来的にこんな感じで@arrayを使いたいのだと思います。これはそのための初期化だと思われます。

基本的にはperlの配列は一次元のスカラーなデータしか持てませんので、この場合は無名ハッシュのリファレンスと言うことになります。

配列の要素へのアクセスは[]を使いますよね。
$a[2]
みたいな感じです。これと同じようにハッシュは
$a{'abc'}
みたいな感じで使います。

つまり[]は配列、{}はハッシュです。
この場合{}の前に何も名前がないので無名ハッシュとなります。

それで配列の要素はスカラーなので無名ハッシュのリファレンスと言うことになります。

何かを初期化するためのものでし...続きを読む

Qアルファベット+数字に部分マッチする正規表現

任意文字数のアルファベット+任意桁数の数値で構成された
単語にのみ部分マッチする正規表現を教えてください。
条件は、前に数字が無いこと、または、後ろにアルファベットが無いことです。


例えば、

  23*ade3456,ad-r4+4er3456=pol34k#gtu34&-de23knm723a3
この場合、

 ade3456
 r4
 gtu34

に、マッチして欲しいのです。

 4er3456
これは、手前に数字があるのでマッチしてはいけません。
 pol34k
こちらは後ろにアルファベットが続いているのでマッチしてはいけません。
 de23knm723a3
これはどこで切っても条件を満たしません。

以上、よろしくお願いいたします。

Aベストアンサー

こんにちは。No.2のものです

コツとしては
「ほしいものを厳密に表現しましょう」
です。

ggable様の考える、「任意文字数のアルファベット+任意桁数の数値で構成された単語」は
 [a-zA-Z]+[0-9]+
ではなく、
 (?<![a-zA-Z])[a-zA-Z]+[0-9]+(?![0-9])
であることが、サンプルから読み取れました。

これに2つの条件を加えまして・・・
 (?<![0-9])(?<![a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9])(?![a-zA-Z])

このままでもいいのですが、まとめてすっきり、
 (?<![0-9a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9a-zA-Z])

という感じです

Q正規表現 \s が、\n に、ヒットする。

# 正規表現 \s が、\n に、ヒットする。
#
# Windows XP(sp3) ActivePerl
#
# This is perl 5, version 12, subversion 3 (v5.12.3) built for MSWin32-x86-multi-thread
# (with 9 registered patches, see perl -V for more detail)
#
# Copyright 1987-2010, Larry Wall
#
# Binary build 1204 [294330] provided by ActiveState http://www.ActiveState.com
# Built Feb 9 2011 14:38:22
#
use strict;
use warnings;
use utf8;

my $a = "\n\n";
$a =~ s/\s/aaaaa\n/ig;
print $a;
__END__

[出力結果]
aaaaa
aaaaa

Aベストアンサー

正規表現式で\sは、スペース、タブ、改行のいずれかを意味します。

(参考)
http://www.site-cooler.com/kwl/perl/8.htm#8-2


人気Q&Aランキング