トップページ⇒tech
97コメント28KB

s/正規表現/を語ろう/e

■ このスレッドは過去ログ倉庫に格納されています
0001Cスレの方々、ご迷惑をおかけしました(恥)NGNG
$_ = '騙りましょう。';
s/騙(ら|り|る|れ|ろ)/語$1/;

別にperlじゃなくてもいいです。。
00022NGNG
s/>>1/うんこ/g;
0003デフォルトの名無しさんNGNG
あのぉ、s/は正規表現じゃないと思うのですが
0004デフォルトの名無しさんNGNG
語ってもいいよ。
早く、ネタ振れ
0005デフォルトの名無しさんNGNG
s/(?<=名前:).*?(?=:)/うんこ/g;

ジサクジエン(・∀・)デシタ!!
0006デフォルトの名無しさんNGNG
例えば、aが何個か続いた後に、bが同じ個数続く
  aaaaaabbbbbb
みたいのに1回でマッチさせるにはどうすればいいの?
0007デフォルトの名無しさんNGNG
>>5
?は任意の一文字かな?
<=ってなんだろ?
()は検索の補助で検索対象にならないのかな?
これはperlの表現か?
最近の正規表現は難しくて、おじさんにはわからんのぉ。
いろいろ教えてくれ
0008デフォルトの名無しさんNGNG
WebProg板でやれよ。
0009デフォルトの名無しさんNGNG
>>7
直前の文字が0回か1回出現する。
0010デフォルトの名無しさんNGNG
何でだよ。

別に Perl 限定じゃないし、CGI な話題でもないし、プログラム技術板で
良いと思うが。
0011デフォルトの名無しさんNGNG
>>10
あっちでやった方が住人が喜ぶから
0012デフォルトの名無しさんNGNG
正規表現がWebProgramだと思ってる8は逝って良し。
0013デフォルトの名無しさんNGNG
ちょっと前にアルゴリズム本で正規表現の
アルゴリズムを読んだけど、結構面白かったな。
0014デフォルトの名無しさんNGNG
>>1 しかし置換パターンに実行文が無いのに"e"オプションを付けるとは。
>>7 任意の一文字は"."だよ。しかし>>5は適当に書いたと思われる。
0015デフォルトの名無しさんNGNG
姉妹スレ@Webプログラミング
正規表現道場@2ch
http://pc.2ch.net/test/read.cgi/php/996105815/

過去スレ
正規表現
http://piza2.2ch.net/tech/kako/993/993143342.html
0016デフォルトの名無しさんNGNG
>>15
WebProg板に正規表現スレがあるほうが板違いだろ
>>6
う、わからん。>>4よ、早くやれ。
0017デフォルトの名無しさんNGNG
厨房な質問ですまんが、Windowsでお手軽に正規表現プログラミングするには
http://www.yamada-labs.com/software/spec/jre/index.htm
こういうライブラリ使うのがいいのかな。
C++なんかで正規表現をさくっとやるには他に手段あんの?
0018デフォルトの名無しさんNGNG
>>6
なんで?
aa*bb*
でいいじゃん。
>>16
つか、もうここでつまずくんかい!
0019デフォルトの名無しさんNGNG
>>18
a と b が同じ数じゃなくてもマッチしちゃうじゃん。
0020デフォルトの名無しさんNGNG
>>19
おぉ、そんな条件があったか。
スマソ見落としてました。
おぉ、一気に難しい(笑)
0021これはネタだなNGNG
>>6
正規表現(3型文法)では無理。
それは文脈自由文法(2型文法)の言語族に属する。
0022デフォルトの名無しさんNGNG
性器表現って何をするために使うんですか?
友人に聞いたら「痴漢するため」と言われました。
彼とはもう口をききたくありません。
00236NGNG
>>21
正解!ネタです。案外早く答えが出たな。
まぁこの機会だから21は正則文法と文脈自由文法の解説でもしてあげてください。
で、複数回の正規表現を組み合わせて良いなら、一番シンプルに仕上げるには
どうすれば良いかな(これはネタではありません)。
0024デフォルトの名無しさんNGNG
どーでも良いけど、「正規表現」って言葉と
実際がどうしても結びつかない。
直訳っすか?>正規表現
00256NGNG
>>24
レギュラーエクプレッションの直訳だから。
「規則的な言い回し」とでも訳すべきなのだが。
0026FAQNGNG
s/(.)[ッ|っ](.)(.)/\1\2ー\3/

以降、同様の質問は不可とす
0027デフォルトの名無しさんNGNG
>>17
boost
0028デフォルトの名無しさんNGNG
>>26
s/(.)[ッ|っ](.)(.)/$1$2ー$3/
だろ?jperlキライだが。
0029デフォルトの名無しさんNGNG
>>28
間違えた、s/(.)[ッっ](.)(.)/$1$2ー$3/だ。
0030FAQNGNG
>>29

スマソ・・・
でもs///の中は$1じゃなくて\1じゃないと参照できないんじゃ
なかったっけ。

正直俺もjperlは嫌いだが。
0031デフォルトの名無しさんNGNG
>>30
s/マッチパターン/置換パターン/
パッチパターンでは \1 .. \9で参照
置換パターン以降、次の正規表現までは $1 .. $9で参照
0032デフォルトの名無しさんNGNG
あ、でもsedとかだと両方とも \1 .. \9 だな
0033デフォルトの名無しさんNGNG
>>28 >>30
なんでjperl嫌いなの?
0034デフォルトの名無しさんNGNG
何で正規表現のライブラリってバイト列を探索するって
形式を踏襲するんだろ。
バッファを持たずに、一文字ずつ
while (matcher←データ) { if (受理()) 位置の記録(); }
という押し込み型になればインタラクティブな入力処理や
プロトコルの処理に都合が良いのに。
こうすれば、文字コードの変換も、全データに対して行う必要がない。
0035デフォルトの名無しさんNGNG
Cで正規表現使えるようにすっか
0036デフォルトの名無しさんNGNG
>>34
そういうのもほしいね
ぜひ作って contribute して下さい(w

そういうライブラリってあったかな…
つっこんだものはなかなか無い…
0037デフォルトの名無しさんNGNG
>>34
自分が正規表現クラス作った経験から言うと、
正規表現のマッチングはバックトラックしなきゃならんので、それは無理です。
全体を受理するまで処理してみなければ、正しい経路がわからんのです。
003837NGNG
と思ったけど。DFAに変換できれば、問題ない気がした。
0039デフォルトの名無しさんNGNG
>>1
過去形と口語のためにちょっと拡張
s/騙(ら|り|る|れ|ろ|っ|ん)/語$1/;
0040デフォルトの名無しさんNGNG
>>38
DFA に変換できればね。
でも、/(.+).*(.+).*\2.*\1/ みたいなやつだと、バックトラックなしでは
無理でない?
0041デフォルトの名無しさんNGNG
拡張正規表現と正規表現は区別しましょう。
0042デフォルトの名無しさんNGNG
正直、>>29が分からない...
0043デフォルトの名無しさんNGNG
>そういうのもほしいね
>ぜひ作って contribute して下さい(w
去年しましたが。
>正規表現のマッチングはバックトラックしなきゃならんので、それは無理です。
>全体を受理するまで処理してみなければ、正しい経路がわからんのです。
バックトラックでやるような処理はしてるけどバックトラックではないです。
ただ、どこで停止させるかという判断はユーザーに任されてる。
>DFA に変換できればね。
する必要はないです。できないのはカーニハンやRMS(regex)のデザインで
やるから仕様縛りが出ます。演算子はQEDの形式しかやってません。
インクリメンタルサーチや置換処理の時にヘンな動作の可能性がありますから、
|やグループ化は排除してます。
0044デフォルトの名無しさんNGNG
>>23
aaabb とかは aabb としてマッチさせんの、それともさせないの?
0045デフォルトの名無しさんNGNG
正規表現での検索って普通は逐次検索なんですか?
kmp法のように正規表現を解析して速度を上げたり出来ないんですか?
0046デフォルトの名無しさんNGNG
>>23>>44
もしマッチしても良いなら、こういうのを考えてみた。
$_ = 'ccccaaaaabbbdd';
$ab = 'ab';
$ab = $1 while(/(a${ab}b)/);
s/$ab/ マッチしたよん /;
print;
シンプルだとは思うが、効率が良いかどうかは謎。
0047デフォルトの名無しさんNGNG
>>45
そう思ったら違う実装にすればよい。
オレのは、探索中に中断できたり文字コード変換を
やりながらのマッチングでもバッファを持ちたくないという要求が
第一にあった。
0048デフォルトの名無しさんNGNG
>>45
もともとの正規表現ってのは、決定性有限状態オートマトンで表現できて、
それを素直に実行させれば、高速に動作するよ。
perl なんかで拡張された正規表現だとバックトラックでやったほうが簡単。
つか、(?=…) をバックトラックせずに、かつメモリ効率もよくマッチング
させるやり方って思いつかん。
0049デフォルトの名無しさんNGNG
>>48
仮想マシン(といってもプログラムカウンタと停止フラグだけ)を
εの度に増殖させる。再帰してもスタックが伸びて行くからコストは
変わらないし、速くも遅くもならない。
0050デフォルトの名無しさんNGNG
>>48
DFAが高速に動作するのは分かるのですが、
それでも高々逐次検索と同程度のパフォーマンスですよね?
BM法やkmp法のように比較要素の刈り込みを導入する
一般的な手法ってないかなって思ったのです。
005150NGNG
どうしてそんなことが必要かといいますと、
テキストエディタの正規表現での強調表示処理を書いていて、
複数の正規表現と比較しないといけないから、高速化したいのですが。

こういう場合は正規表現を合成する方が良いんでしょうか
0052デフォルトの名無しさんNGNG
>>49
でも、それって結局、バックトラックしてることにならない?
仮想マシン間で同期をとりながら実行すればよいのかな?
かなり面倒そうだけど。
0053デフォルトの名無しさんNGNG
>>52
同期なんか取らない。
S'←S(c)
を繰り返し行うだけ。
プログラム的にはむしろ短く単純になる。
match(c)という一個の関数の中で状態を
複数持ち、個数分だけ遷移させて終了。
0054デフォルトの名無しさんNGNG
>>50
ああ、そういう意味か。さすがに一般的な正規表現に対して検索位置の
スキップが可能なような実装はないんじゃないかな。
正規表現から固定文字列部分を抜き出して、最初にそこを BM なりなんなりで
検索するってのは、たいていのエンジンで実装されていると思うけど。
複数の固定文字列の検索だったら、古典的だけど、Aho-Corasick とか
Commentz-Walter とかの手法はあるよ。
0055デフォルトの名無しさんNGNG
>>51
漏れならその場合なら合成する。ただDFAでも
function +[0-9A-Za-z]
みたいな正規表現なら、"function"のような固定長の部分を
1つの状態にしてBM法で検索するなどは可能。
0056デフォルトの名無しさんNGNG
>>50
DFAつーのは最小化アルゴリズムがあるんですよ。
オートマトンや形式言語の教科書読んでね。


0057デフォルトの名無しさんNGNG
>>56
最小化と高速化は関係ないでしょう
0058デフォルトの名無しさんNGNG
>>57
その通り。
でもスレ伸びないから話題としてlexなんかでは実行時に
圧縮されたテーブルの展開(Jhonsonの二重配列の参照)
をするんで元データ-が小さいことはいいことだと振ってみる。
0059デフォルトの名無しさんNGNG
>>53 その複数の状態の直積をひとつの状態とできると見たが如何。
0060デフォルトの名無しさんNGNG
DFAって常に最長のマッチが探せるわけじゃなかったよね?
最長を探せるのはなんだっけ?
POSIX NFAだったかな
0061デフォルトの名無しさんNGNG
>>59
DFAというのは吉野家のねぎだくと同じ両刃の剣。
店員にマークされるよりも怖い空間量の爆発。
経路もわからないんで置換に向かない。
(性能落とせば分かるんだったっけ)
NFAの方がライブラリとしては適切。
0062デフォルトの名無しさんNGNG
>>60
常に探せる。停止させなければ。
0063デフォルトの名無しさんNGNG
>>62
んじゃ、技術力が及ばない場合を除いて、
DFA以外を選択する意味はないってこと?
0064デフォルトの名無しさんNGNG
>>63
経路がわからないので置換できない。
(できるのもあるみたいだが
部分式だけDFAにしてるんで
メリットを相殺してる)
メモリーの使用量がタマーに巨大化する。
(遅延評価というテクでも完全には克服できないみたい)
0065デフォルトの名無しさんNGNG
>>63 Henry Spencer 並の技術力があれば挑戦するのも良かろう。
0066デフォルトの名無しさんNGNG
Henry Spencer って、いまでも現役で正規表現エンジン作ってんの?
0067デフォルトの名無しさんNGNG
Tcl!
0068デフォルトの名無しさんNGNG
保全age
0069デフォルトの名無しさんNGNG
age
0070デフォルトの名無しさんNGNG
関連スレ:数学板「☆オートマトンをマターリ語るスレ☆」
http://cheese.2ch.net/test/read.cgi/math/1017770466/
0071デフォルトの名無しさんNGNG
Javaのソースに以下のデバッグコード埋め込み処理を行いたいのですがパーノレでは
どんなふうにすばらしく行うことができますか。
・メソッドブロック開始の「{」の直後で改行し
「System.out.println("クラス名.メソッド名:in");」
を挿入し改行。
・メソッドブロック終了の「}」の直前に
「System.out.println("クラス名.メソッド名:out");」
を挿入し改行。
・コンストラクタ開始の「{」の直後(superがある場合はsuperの直後)で改行し
「System.out.println("クラス名.Constructer:in");」
を挿入し改行。
・コンストラクタブロック終了の「}」の直前に
「System.out.println("クラス名.Constructer:out");」
を挿入し改行。
0072デフォルトの名無しさんNGNG
NFA
ttp://aglaia.c.u-tokyo.ac.jp/~yamamoto/Yamaguch_Seminar/20010725/node3.html
DFA
ttp://aglaia.c.u-tokyo.ac.jp/~yamamoto/Yamaguch_Seminar/20010725/node4.html
0073デフォルトの名無しさんNGNG
NFAのプログラムの設計図をWEBに載せるとして、
どんな図面書けば理解してもらえる?
片言ALGOLだとわかってもらえんし
UML検討したけどイマイチぴんと来ない。
0074デフォルトの名無しさんNGNG
compilerの解説も載せてくれたらうれしいんだけど
0075デフォルトの名無しさんNGNG
s/正規表現|NFA/DFA/ のアルゴリズムの良いページキボンヌ。
0076デフォルトの名無しさんNGNG
http://www.sorekika.com/pda/dame.jsp?idx=352
正規表現の神
0077デフォルトの名無しさんNGNG
>>76
おもろすぎ
0078デフォルトの名無しさんNGNG
NFA→DFA
http://cs.fit.edu/~ryan/cse3002/nfa2dfa.pdf
0079オレの彼女はNGNG
セイキ表現を恐らく何か別なものと勘違いしている。
なので彼女はこの言葉を言わない。
男同士でニヤニヤしながら話しているのが誤解の原因
かもしれない...。
一度、正しい説明したほうがいいのか教えて欲しい。

(脱線してすまない。)

0080デフォルトの名無しさんNGNG
練習を兼ねて正規表現ライブラリを自作しています。
教科書通りにRE→NFA展開、DFA変換とやったのですが
(*a)+
みたいなε遷移だけになってしまう可能性のあるグループに
繰り返し文字を摘要すると、NFA状態遷移図にループが生じて
しまいますよね。
こういう正規表現は禁止にするべきなのでしょうか?
それとも回避する一般的な手法があるのでしょうか...
0081デフォルトの名無しさんNGNG
>>80
自分がライブラリを作ったときは、禁止しちゃいましたね。
DFA への変換はせずに NFA を直接実行するタイプだったけど、
ε遷移を含むグループの繰り返しというのは、パターンが
バグってる可能性も高いし、と思って。
0082デフォルトの名無しさんNGNG
めちゃくちゃ遅ネタだけど。
http://slashdot.jp/article.pl?sid=02/06/06/0720253&mode=nested
008380NGNG
>>81
どうもです。
やはり禁止が手っ取り早そうですね。
どっちにしてもこの状態を検出してREのコンパイルを中止する
ようにしないと、使い物にならないわけですね。
毎回、探索済みのε遷移を保存しておいて重複チェックをしてと...
0084デフォルトの名無しさんNGNG
グループ化サポートしちゃったら
バックリファレンスのバリエーション増えるから
一つの値返したら結果がランダムになっちまう。
そこで、結果集合を返すようにしたけどヘン。
置換用はQEDの演算子に絞り、
orとグループはシラブル分け(トークンリーダー)用
とするのが妥当(それでも一意にはならないが)。

#Perl、Rubyの仕様は壊れている。
0085デフォルトの名無しさんNGNG
うわ、(?...) なんて最近の Perlにはあるんだ。はじめてしったよ。

Perlの REは backslashまみれにならなくてすき (emacsenだけに) だけど
こうやって非互換性がふえていくんだな..
0086デフォルトの名無しさんNGNG
性器を見たいがために,正規表現を用いてhtmlからurlリストを切り出し
ひたすらDLする漏れは逝ってよしですか?
多分これが終わったら逝ってくると思うけどモナー
0087デフォルトの名無しさんNGNG
>>85
安心してください。(?...)はPerl6ではなくなります。
非互換性はさらに増えますが(わら
何しろ[]が文字クラスじゃなくなるしねえ。
0088デフォルトの名無しさんNGNG
m:p5があるやん
0089デフォルトの名無しさんNGNG
>>84
言ってる事がよく理解できてないけど、DFA でバックリファレンスを
扱うことが難しいということかな。
perl は NFA をバックトラックで実行するので、先読みだろうが
バックリファレンスだろうが、問題なくサポートできるというわけ。
009084NGNG
えーっとですね、
>>89
8進数か10進数というパターンに
(0([0-7]+))|([0-9]+)
入力が011だった場合、バックリファレンス\1は
カラ文字でも11でもどちらでも間違いではないってこと。
複数の解ができるのに結果を一つしか選ばないPerlはヘンってこと。
すくなくとも、sedの仕様ならば置換結果は一つ。
0091デフォルトの名無しさんNGNG
>>90
> 複数の解ができるのに結果を一つしか選ばないPerlはヘンってこと。
いや、「複数の解のうちどの一つを選ぶか」は明確に仕様になっているよ。

> カラ文字でも11でもどちらでも間違いではないってこと。
少なくともPerlでは「11」が正解で空文字列は間違い。

84のいいたいことがおいらにはよく理解できてない……。
0092名無しさん@カラアゲうまうまNGNG
落ちる…
0093デフォルトの名無しさんNGNG
>>84
Perl6では:anyで結果*集合*を返すらしいよ。
0094デフォルトの名無しさんNGNG
Vimが支持される理由の一つに、正規表現が体に染みつくようになるというものがあります。
事実、上級Vim使いは検索コマンドを移動コマンドと同一視して編集作業をするとか。
画面内を /int .\+; とか打ち込んで飛び回るんだそうで。 
0095 NGNG
 
0096デフォルトの名無しさんNGNG
age
0097名無しさん@EmacsNGNG
>>94
そういうエディタの使い方する奴はvi以外のエディタを使ってようと
いずれ自分で正規表現を覚えるよ.

俺はsedが好き.
■ このスレッドは過去ログ倉庫に格納されています