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

このエントリーをはてなブックマークに追加
$_ = '騙りましょう。';
s/騙(ら|り|る|れ|ろ)/語$1/;

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

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

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

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

以降、同様の質問は不可とす
>>17
boost
28 :デフォルトの名無しさん:02/03/06 20:00
>>26
s/(.)[ッ|っ](.)(.)/$1$2ー$3/
だろ?jperlキライだが。
29 :デフォルトの名無しさん:02/03/06 20:01
>>28
間違えた、s/(.)[ッっ](.)(.)/$1$2ー$3/だ。
30 :FAQ:02/03/06 20:29
>>29

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

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

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

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


>>56
最小化と高速化は関係ないでしょう
58 :デフォルトの名無しさん:02/03/08 22:54
>>57
その通り。
でもスレ伸びないから話題としてlexなんかでは実行時に
圧縮されたテーブルの展開(Jhonsonの二重配列の参照)
をするんで元データ-が小さいことはいいことだと振ってみる。
59 :デフォルトの名無しさん:02/03/08 23:11
>>53 その複数の状態の直積をひとつの状態とできると見たが如何。
DFAって常に最長のマッチが探せるわけじゃなかったよね?
最長を探せるのはなんだっけ?
POSIX NFAだったかな
61 :デフォルトの名無しさん:02/03/08 23:25
>>59
DFAというのは吉野家のねぎだくと同じ両刃の剣。
店員にマークされるよりも怖い空間量の爆発。
経路もわからないんで置換に向かない。
(性能落とせば分かるんだったっけ)
NFAの方がライブラリとしては適切。
62 :デフォルトの名無しさん:02/03/08 23:27
>>60
常に探せる。停止させなければ。
>>62
んじゃ、技術力が及ばない場合を除いて、
DFA以外を選択する意味はないってこと?
>>63
経路がわからないので置換できない。
(できるのもあるみたいだが
部分式だけDFAにしてるんで
メリットを相殺してる)
メモリーの使用量がタマーに巨大化する。
(遅延評価というテクでも完全には克服できないみたい)
65 :デフォルトの名無しさん:02/03/08 23:44
>>63 Henry Spencer 並の技術力があれば挑戦するのも良かろう。
66 :デフォルトの名無しさん:02/03/10 21:41
Henry Spencer って、いまでも現役で正規表現エンジン作ってんの?
67 :デフォルトの名無しさん:02/03/13 04:48
Tcl!
68 :デフォルトの名無しさん:02/04/13 10:22
保全age
69 :デフォルトの名無しさん:02/04/13 23:23
age
関連スレ:数学板「☆オートマトンをマターリ語るスレ☆」
http://cheese.2ch.net/test/read.cgi/math/1017770466/
71 :デフォルトの名無しさん:02/04/14 02:57
Javaのソースに以下のデバッグコード埋め込み処理を行いたいのですがパーノレでは
どんなふうにすばらしく行うことができますか。
・メソッドブロック開始の「{」の直後で改行し
「System.out.println("クラス名.メソッド名:in");」
を挿入し改行。
・メソッドブロック終了の「}」の直前に
「System.out.println("クラス名.メソッド名:out");」
を挿入し改行。
・コンストラクタ開始の「{」の直後(superがある場合はsuperの直後)で改行し
「System.out.println("クラス名.Constructer:in");」
を挿入し改行。
・コンストラクタブロック終了の「}」の直前に
「System.out.println("クラス名.Constructer:out");」
を挿入し改行。
73 :デフォルトの名無しさん:02/04/22 21:56
NFAのプログラムの設計図をWEBに載せるとして、
どんな図面書けば理解してもらえる?
片言ALGOLだとわかってもらえんし
UML検討したけどイマイチぴんと来ない。
74 :デフォルトの名無しさん:02/04/22 22:01
compilerの解説も載せてくれたらうれしいんだけど
75 :デフォルトの名無しさん:02/04/23 02:34
s/正規表現|NFA/DFA/ のアルゴリズムの良いページキボンヌ。
76 :デフォルトの名無しさん:02/04/30 02:31
>>76
おもろすぎ
79 :オレの彼女は:02/06/09 11:38
セイキ表現を恐らく何か別なものと勘違いしている。
なので彼女はこの言葉を言わない。
男同士でニヤニヤしながら話しているのが誤解の原因
かもしれない...。
一度、正しい説明したほうがいいのか教えて欲しい。

(脱線してすまない。)

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

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

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

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

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

俺はsedが好き.