正規表現の否定先読みで、複数の否定文字列を指定する方法はありませんか?

例えば、
/(a)(?!bbb)/
は、後ろにbbbが続かないaを意味すると思いますが、
後ろにbbb、ccc、dddのいずれもが続かないaを表現する方法を探しています。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

単純に


/a(?!bbb|ccc|ddd)/
じゃダメなんだっけ?

この回答への補足

/a(?!(bbb|ccc|ddd))/
で、うまくいきました。ヒントをありがとうございました。

補足日時:2010/04/27 22:59
    • good
    • 1
この回答へのお礼

ありがとうございます。
やってみましたが、それではダメなようです…。

お礼日時:2010/04/27 22:22

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

Q拡張子の正規表現

emacs や xyzzy で、
設定ファイルの中に、
拡張子の正規表現として、

 \\.vbs

のような表現がありますが、
ずっと以前から疑問に思っています。

 \.vbs

なら意味がすぐに分かるのですが、
その前に \ をつける必要性が分かりません。

この \ (私にとりましては余分に見える \ )には
どのような意味があるのですか?
どなたかお教え願えませんでしょうか?
どうぞよろしくお願いします。

Aベストアンサー

>つまり正規表現関数に渡されるのは2番目の \ 以下の文字列、
>ということでよろしいんでしょうか?

はい、そうです。
日本語環境だと円マークですが、海外だとバックスラッシュのことが
ほとんどで、バックスラッシュがたくさんあるさまをみて
爪楊枝が並んでいるようだとかいわれたりしています。

Q@b = grep(/マッチパターン/, @a);でなく@a = grep(/マッチパターン/, @a);でOKについて

@b = grep(/マッチパターン/,@a);だと配列@aの中でマッチするものを探して@bに入れる・・・というのは理解できるんですが、
@a = grep(/マッチパターン/,@a);とし、
foreach $_ (@a) {
print $_;
}
で参照した場合、@aの中のマッチパターンにマッチするのだけ表示されますけれども、ここでマッチしないのは削除されるのでしょうか・・。

@aから@aにいれる・・・となる事について、どのように@aにマッチしたものを入れ、マッチしないものは削除されるのかの仕組みについて、ご説明できる方はいらっしゃいますでしょうか(例えば内部的にpopやshiftが機能していて・・・みたいな事なのかな・・とか思うんですけれども)

お手数ですが、ご存知の先生方ご教授願えましたら幸いです。

Aベストアンサー

#1でのTacosanさんの回答の1です。
つまり、
@a = grep(/マッチパターン/,@a);
これは
@aの内容を列挙→ grepに掛ける→条件に合うものだけのリストを作成→作成したリストを代入。
となります。
grepに掛かる前の@aの内容は、代入の際に「丸ごと」破棄されます。

perly.y
/* Binary operators between terms */
termbinop:term ASSIGNOP term /* $x = $y */
{ $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
TOKEN_GETMAD($2,$$,'o');
}

op.c

OP *
Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
{
dVAR;
OP *o;

(略

if (is_list_assignment(left)) {
static const char no_list_state[] = "Initialization of state variables"


という具合なので、代入の左右両辺が同じ変数かどうかのチェックは多分やってません。

#1でのTacosanさんの回答の1です。
つまり、
@a = grep(/マッチパターン/,@a);
これは
@aの内容を列挙→ grepに掛ける→条件に合うものだけのリストを作成→作成したリストを代入。
となります。
grepに掛かる前の@aの内容は、代入の際に「丸ごと」破棄されます。

perly.y
/* Binary operators between terms */
termbinop:term ASSIGNOP term /* $x = $y */
{ $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
TOKEN_GETMAD($2,$$,'o');
}

op.c

OP *
Perl_newASSIGNOP...続きを読む

Q正規表現を教えて下さい。

正規表現を教えて下さい。
1行目の各拡張子を(赤)、2行目の行頭のsakuraを(青)、それ以外を(黄)に色分けする正規表現を教えて頂けないでしょうか。

[.txt;.ini;.cfg;
sakura|"D:\Program Files\sakura\sakura.exe" "%P"
]

サクラエディタ ver.1.6.50

Aベストアンサー

> 2行目のパス部分の拡張子(.exe)は、「それ以外(黄)」にしたいのです

もともとの質問には、それ以外の部分(黄色)は2行目の拡張子だとはどこにも書かれていなかったので、最初の回答ではテキスト全体を黄色に指定しましたが、そういうことじゃないんですね?だとすると、完全な形ではできません。と言うのは1行目のキーワードとかぶっているからで、妥協しないと無理です。

2行目の拡張子の色分け:(正規表現キーワード3)ただしダブルクォートまで色が変わる
/\.[^.]+"/k

よく考えたら、通常の正規表現じゃない色分けが動くと、ダブルクォートで囲まれた部分が「文字列」として色分けされてしまうので、この色分けが働かないように(色分けのチェックボックスを外す)しておく必要もありそうです。

Qxxxxxxx = "aaa bbb ccc"という文字列の""で囲まれた部分を処理したい

最終的にリストにしたいので、正規表現で""内を取り出した後に
split /( | )/のような処理をすればいいのだと思うのですが、まず第一に""内の文字列を取り出せません。
はじめのxxxxxxxは決まった文字列ですので、これを変数にできれば早いんですがそういう処理はできないですよね?

フォーマットは決まっているのですが、どうやって""内の文字列を取り出せばいいのでしょうか?

@ARGV =~ s/\".*\"$/$1/;
こういう処理ではうまくいきませんでした。
Perlを触るのが初めてなので、ネットで調べていますがさっぱりわからなくて途方に暮れています。
よろしくお願いします。

Aベストアンサー

ん~, なんで @ARGV に対して =~ するかなぁ?
普通は $ARGV[0] =~ /"(.*)"$/; と $1 にとりだしたりするものですが.
まあ, あたまに '$' つけて eval すれば変数になるけど, これは普通じゃないし.

QVB2010の正規表現

VB2010の正規表現についての質問です。
ファイル名に複数のドット(ピリオド)が含まれる時や、複数の拡張子がある時でも、
一番最後にある拡張子だけを取り出したいのです。

System.Text.RegularExpressions.Regex("正規表現")
で正規表現を指定していますが、

例えば、『T.M.Revolution.m3u』の場合は、『.m3u』だけを取り出したいので、

("[.].*$")

とすると、マッチする部分が『.M.Revolution.m3u』となる為、

("([.].*){1}$")

に、試しに変更してみましたが、失敗してしまいました。


知っている方、
『上記の書き方だと何故ダメなのか』 と、 『この場合の正しい正規表現』
を教えていただけませんか?

あと、正規表現ではない代替案などが有れば、是非それも教えて頂きたいです。
よろしくお願いします。

Aベストアンサー

正規表現なんて使わなくても、
dim hoge as string = "T.M.Revolution.m3u"
dim extension as string = hoge.Substring(hoge.LastIndexOf("."))

とかでいいんではないでしょうか。

もしくはPath.GetExtension()を利用して
imports System
dim hoge as string = "T.M.Revolution.m3u"
dim extension as string = Path.GetExtension(hoge)

みたいな。

Qperl qw(aaa bbb ccc)[$hoge]のような記述

my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]);

2行目のsprintfですが、qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]はどのようなことが行われているのでしょうか?
sprintf("%s", "hello world!");みたいな基本的なものならsprintfの使い方はわかります。ですが、qw(aaa bbb ccc)[$hoge]のような記述についてがわかりません。
上記の例でいえば、どういう結果になるのかはわかるのですが、どういう過程で代入されているのかがわかりません。

qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]という書式はどういうことが行われているのか教えてください。よろしくお願いします。

Aベストアンサー

> my @weekname = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
> $wday = sprintf("%s", $weekname[$wday]);

ならわかりますか?

0~6の7要素の配列 @weekname を使うことで、数字から曜日名への変換をしてます。

この配列変数の代入は、qw 演算子を使うと、

> my @weekname = qw(Sun Mon Tue Wed Thu Fri Sat);
> $wday = sprintf("%s", $weekname[$wday]);

と書けます。
(qw演算子を使えば、文字列配列を簡潔に書けるようになります。結果は同じ)

さらに、@weekname という配列変数を作ってますが、一度きりしか使ってないのに変数を作るのは無駄なので、
> $wday = sprintf("%s", $weekname[$wday]);
このweename部分に@weeknameの中身である、qw(Sun Mon …) を入れてしまえば、
> $wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]);
になります。

でも、これって、ちょっと無駄な表現ですね。
「sprintf("%s",○○)」って、元の「○○」と同じ(何もしてない)ので、
> $wday = qw(Sun Mon Tue Wed Thu Fri Sat)[$wday];
で十分。

> my @weekname = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
> $wday = sprintf("%s", $weekname[$wday]);

ならわかりますか?

0~6の7要素の配列 @weekname を使うことで、数字から曜日名への変換をしてます。

この配列変数の代入は、qw 演算子を使うと、

> my @weekname = qw(Sun Mon Tue Wed Thu Fri Sat);
> $wday = sprintf("%s", $weekname[$wday]);

と書けます。
(qw演算子を使えば、文字列配列を簡潔に書けるようになります。結果は同じ)

さらに、@weekname という配列変...続きを読む

Q正規表現で絶対パス表示のファイル名からファイル名だけを削除したい

Perlの正規表現を使って
c:\xxxx\xxxx\xxxx\xxxx\abc.txt
のようにファイルの絶対パスで記述されている文を
c:\xxxx\xxxx\xxxx\xxxx
のように
ファイル名部分だけを削除して、
フォルダの絶対パスに
表示させる正規表現を教えていただけないでしょうか?
ちなみにxxxxは可変値、階層の深さも決まっておらず、
ファイルの拡張子もtxt,htm,拡張子なしなどです。

よろしくお願いいたします。

Aベストアンサー

最下行しか変換されないということですが、

$file='C:\xxxx\xxxx\xxxx\xxxx\abc.txt<改行>C:\yyyy\yyy\yyy\def.htm<改行>D:\zzz\ghi.doc'

みたいな形でデータが入っているのではないかと思います。(改行入っているかどうかまでは判断できませんが)

もしそうであれば、
$file=~s/\\[^\\]*\r/\r/g;
で解決すると思います。

Q正規表現について

Perlの初心者です。

正規表現の指定方法がよくわかりません。
ディレクトリー内の該当するCSVファイルの抽出をしたいのですが、

"xyz20050105*.csv"に該当するデータすべてを抽出したい。

下記のように、詳細に指定して該当するCSVのファイル名を取得したいのですが、これだとディレクトリー内がすべて表示されてしまいます。

@FTPlist = grep ("$head$year$mon$mday*.csv", readdir(DIR));

どのように指定すればよいのでしょうか?

Aベストアンサー

#2です。
正規表現部分は、
@FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR));
のような感じになると思います(試してません)。

Qperl 正規表現 抽出

perl の正規表現を用いて、文字列の抽出を行いたいのですがどのように
書けばいいのかわかりません。

実現したいことは
「Y:/フォルダ名/フォルダ名/ファイル名.拡張子」
というテキストに対して
「拡張子」のみを抽出することと
「ファイル名」のみを抽出することです。

パターンマッチや変換はなんとなくわかるのですが
抽出の仕方がよくわかりません。
よろしくお願いいたします。

Aベストアンサー

File::Basenameを使うのがよいかと。
http://perldoc.perl.org/File/Basename.html

もしかすると、cmd.exeでdirとforを使うか、Scripting.FileSystemObjects使うほうが楽かもしれない。

参考URL:http://www.ideone.com/EAlSM

Q正規表現

変数$aのなかに変数$bが含まれていたらをperlの正規表現であらわすと
どのようになるのでしょうか?if($a=~ /$b/)ではうまくいかないのですか?

Aベストアンサー

$bの内容によります。

$bに正規表現で意味がある記号など含んでいると、
期待通りには行きません。

単に、含まれているか調べるだけなら、index で調べられます。


$a='2^8=256 2^10=1024';
$b='^8';

if($a =~ /$b/){
print "test1 OK\n";
}else{
print "test1 NG\n";
}

if(index($a,$b) >= 0){
print "test2 OK\n";
}else{
print "test2 NG\n";
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報