正規表現道場@2ch
■ このスレッドは過去ログ倉庫に格納されています
0001ヽ(´▽`)ノ
2001/07/26(木) 09:03ID:???でもperlを使いのなす上で避けて通れない道だったりするかもです。
そこで、スクラップブック的に目に止まったカッコイイ正規表現を
書き留めておこうと言うスレッドです。
質問する時は言語と、得たい結果をなるべく詳しく書いてね。
取り合えず僕が知ってる有用なリンクです。
http://www.din.or.jp/~ohzaki/perl.htm
http://www.kt.rim.or.jp/~kbk/regex/regex.html
もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・
010190
01/10/10 01:04ID:???0102名無しさん@お腹いっぱい。
01/10/10 01:54ID:???として、掲示板スクリプトの書き込みの中にあるURLに
こうやって自動リンク貼ってる。↓
$data =~ s/($http_URL_regex)/<a href="$1">$1<\/a>/go;
現状だと
http://www.test.com/dir/index.html が
<a href="http://www.test.com/dir/index.html>http://www.test.com/dir/index.html</a> に
置き換わるだけだけど、URL表示の/(スラッシュ)を「<wbr>/」に
置き換えるようにしたい。
具体的には、上の例でいうと
<a href="http://www.test.com/dir/index.html>http://www.test.com<wbr>/dir<wbr>/index.html</a>
って感じにしたい。
一行が長くてゴメソ。分かる人教えて。
0105名無しさん@お腹いっぱい。
01/10/12 02:04ID:???分かるもなにも、その$http_URL_regexってやつを
見せてもらわんと。そんなに長いんか?
も、もしかして、大崎氏の「Perlメモ」にある
ものすごい正規表現のことかな。。。
0106名無しさん@お腹いっぱい。
01/10/12 02:04ID:???$data =~ s/($http_URL_regex)/&convurl($1)/ge;
sub convurl {
my($url) = shift;
my($str) = qq{<a href="$url">};
$url =~ s|(?<!/)/(?!/)|<wbr>/|g;
$str .= qq{$url</a>};
}
こんなんしか思いつかんダサ
0107104
01/10/12 09:48ID:???bingo...
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
にあるやつです。
>>106
うまくいった!ありがとう!
0108名無しさん@お腹いっぱい。
01/10/12 12:46ID:???^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
リンク張るならここまでだろ。2chださい。
0109名無しさん@お腹いっぱい。
01/10/12 13:13ID:???quoteなし
<a href=http://hoge.com/hoge.html>http://hoge.com<wbr>/hoge.html</a>
quoteあり
<a href="http://hoge.com/hoge.html">http://hoge.com<wbr>/hoge.html</a>
quote閉じ忘れ
<a href="http://hoge.com/hoge.html>http://hoge.com<wbr>/hoge.html</a>
0112名無しさん@お腹いっぱい。
01/10/15 01:29ID:???0113名無しさん@お腹いっぱい。
01/10/15 06:28ID:???その心は「クォート閉じ忘れやクォートなしは不正なのに、
それに対応していない2chを批判するのは馬鹿」という理解でよいですか。
0114名無しさん@お腹いっぱい。
01/10/15 08:08ID:???<a href="http://example.com/">http://example.com/</a>
ということでお題。
&は含むけど<や>は含まないように
リンクを張る正規表現は?
0115名無しさん@お腹いっぱい。
01/10/15 08:11ID:???$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
0116113
01/10/15 09:07ID:???いや、そういう意味で言ってるんだとしたら間違ってるよ。
っていいたかったの。
> &は含むけど<や>は含まないように
> リンクを張る正規表現は?
URLという意味では<が含まれてても問題(よね?)と思うので、
<や>をはじく必要は無いと思うけど・・・
ちょっと考えるよ。
0117名無しさん@お腹いっぱい。
01/10/15 09:12ID:???$116 =~ s/(問題)/$1無い/;
$116 =~ s/</</g;
$116 =~ s/>/>/g;
0118名無しさん@お腹いっぱい。
01/10/15 10:07ID:???問題あるよ。
http://www.isi.edu/in-notes/rfc2396.txt
0119名無しさん@お腹いっぱい。
01/10/15 10:08ID:???< や > が含まれてると問題あるけど、htmlソース上は
< や > だから含まれてしまうのを
修正したいってことなんだけど。
0120113
01/10/15 10:18ID:???リンク張ってるのがまずいんですね。
リンク張りつつ < > 除去すれば正確になるのかな。
s{
((?:https?|ftp|gopher|telnet|whois|news)://[-_.!~*'()a-zA-Z0-9;/?:\@&=+\$,%]+)
| (<) | (>)
}{
$1 ? "<a href=\"$1\">$1</a>" :
$2 ? '<' :
$3 ? '>' :
''
}xeg;
とかはどうですか?
0121113
01/10/15 10:37ID:???s{(
(?:https?|ftp|gopher|telnet|whois|news)://
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
0122名無しさん@お腹いっぱい。
01/10/15 11:23ID:???s{(
(?:(?:https?|ftp|gopher|telnet|whois)://|news:)
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
0123名無しさん@お腹いっぱい。
01/10/15 11:35ID:???s{(
(?:(?:https?|ftp|gopher|telnet|whois)://|news:)
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%#] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
0124名無しさん@お腹いっぱい。
01/10/15 11:51ID:???これで十分かな?
s{((?:https?|ftp)://(?:[-\w.!~*'();/?:\@=+\$,%#]|&(?![lg]t;))+)}{<a href="$1">$1</a>}g;
どっちにしても中途半端だけど。
0125名無しさん@お腹いっぱい。
01/10/15 12:21ID:???s{((?:https?|ftp)://(?:[-\w.!~*'();/?:\@=+\$,%#]|&(?![lg]t;))+)}{<a href="$1" target=_blank>$1</a>}go;
0126名無しさん@お腹いっぱい。
01/10/15 12:57ID:???ちがうの?
0127名無しさん@お腹いっぱい。
01/10/15 13:01ID:???0128名無しさん@お腹いっぱい。
01/10/19 22:45ID:SauUPYVx0129名無しさん@お腹いっぱい。
01/10/20 00:13ID:???#詳説買って来たけどかなり本棚の肥やしになりそうな感じ・・・
0130名無しさん@お腹いっぱい。
01/10/20 08:13ID:???0131名無しさん@お腹いっぱい。
01/10/20 16:58ID:rS0gfeFk0132名無しさん@お腹いっぱい。
01/10/20 22:31ID:???良く突っ込まれる例:
あめぞうって、2chとかMAGABBSと同じタイプ?
0133名無しさん@お腹いっぱい。
01/10/25 02:00ID:GZ9i4shVhttp://www.2ch.
net/
<a href="http://www.2ch.net/">http://www.2ch.net/</a>
0134名無しさん@お腹いっぱい。
01/10/25 02:24ID:???0135名無しさん@お腹いっぱい。
01/10/25 17:47ID:???0136名無しさん@お腹いっぱい。
01/10/25 17:56ID:???0137名無しさん@お腹いっぱい。
01/10/26 09:05ID:+A/kF3WN0138名無しさん@お腹いっぱい。
01/10/26 11:48ID:???read.cgiでは直ってるみたいね。
0139名無しさん@お腹いっぱい。
01/10/26 11:54ID:???0140名無しさん@お腹いっぱい。
01/10/27 00:02ID:7lO0RLH00141名無しさん@お腹いっぱい。
01/10/28 01:33ID:???0142名無しさん@お腹いっぱい。
01/11/08 04:45ID:???詳説難しいって言う意見が有るけど(確かに ^-^; )
俺は最初詳説買ってチンプンカンプンだったんで、ゆたか氏の正規表現入門を
買ったよ、それから詳説読んだら理解がすすみやすかった
0143名無しさん@お腹いっぱい。
01/11/17 19:17ID:BIcYTt7w0144吉野家シリーズでいってみよう!
01/11/17 22:44ID:Sr4+rAbn先日、正規表現のエンジン書いたんです。NFA.
そしたら単語境界の処理とかどうとか聞いてくるんです。
もうね、アホかと。馬鹿かと。
お前な、正規表現で表せねー機能拡張するんじゃねーよ、ボケが。
機能拡張だよ、機能拡張。
なんか文字クラスかあるし。
よーしパパ繰り返し回数指定サポートだー、とか言ってるの。
ここでぶち切れたね。
正規表現はな、状態数有限、男同士でケツを挿すか挿されるか
そこがいーんじゃねーか、状態数爆発させる奴はすっこんでろ。
あのな、E{8}で8回繰り返すなんてきょうび流行んねーんだよ。ボケが。
得意げな顔して何がPerlの拡張正規表現だ。
お前は本当に前処理展開が必要なのかと問い詰めたい。
小一時間問い詰めたい。
0145sage
01/11/17 22:57ID:???端折らないでちゃんとやってよ〜。
0146名無しさん@お腹いっぱい。
01/11/18 00:31ID:???[0-9a-z]{1,8}
0147143
01/11/18 02:39ID:???0148名無しさん@お腹いっぱい。
01/11/18 02:44ID:???何かネタかと思ったが
0149名無しさん@お腹いっぱい。
01/11/18 03:00ID:???0150名無しさん@お腹いっぱい。
01/11/18 04:31ID:???BBSに削除機能付けるから仕方なくって所だな。。。
0151ひろゆき@管直人
01/11/18 04:41ID:???0152名無しさん@お腹いっぱい。
01/11/18 13:41ID:???「バオー来訪者」に出てきた九官鳥のほうが正しくお礼を言えてるぞ。
0153名無しさん@お腹いっぱい。
01/11/18 17:44ID:???オモロイ
0154名無しさん@お腹いっぱい。
01/12/12 17:13ID:???c:\Program Files\hoge.exe
c:\Program Files\hankaku.mp3
c:\Program Files\全角.mp3
を抽出する方法キボンヌ
m/"\S.*?\S"/g
だと
"c:\Program Files\hoge.exe"
にヒットします.
"なしでヒットする方法キボンヌ(後方参照を使わずに)
0155名無しさん@お腹いっぱい。
01/12/12 17:22ID:9gYD63hd0156名無しさん@お腹いっぱい。
01/12/12 18:22ID:???0157名無しさん@お腹いっぱい。
01/12/12 18:35ID:???目がうろこ
じゃあ
"hoge\\asdf\"hage"
から
hoge\\asdf\"hage
を抜き出す方法って無い?
0158名無しさん@お腹いっぱい。
01/12/12 18:38ID:???そういうファイルがあるってこと?
ファイル名に使えない文字だよ?>"
0159名無しさん@お腹いっぱい。
01/12/12 18:50ID:???0160名無しさん@お腹いっぱい。
01/12/12 19:17ID:???じぶんではやろうとしないんだね。。
/(?:").+(?!"\s)/
0161名無しさん@お腹いっぱい。
01/12/12 21:16ID:???foreach my $n (2..100) {
my $number = '1' x $n;
print "$n\n" if $number !~ /^(11+)\1+$/g;
}
「ほう、正規表現でこんなんできんのかいなー」と思ったコードでした。
0162デフォルトの名無しさん
01/12/12 22:31ID:???0163名無さん@お腹いっぱい
01/12/12 23:48ID:3swbdtRp$_ ='today is monday. tomorrow\ is\ tuesday. I\ hate\ \\\\\\';
while( /\s*((?:\\\S|\\\s|\S)+)\s*/g ){
push( @x, $1 );
}
print join( "\n", @x ), "\n";
切り分けてからバックスラッシュを除去するタイプ。
まとめてやっちゃえないかな。
0164名無しさん@お腹いっぱい。
01/12/13 00:07ID:???0165名無しさん@お腹いっぱい。
01/12/13 00:10ID:???0166名無しさん@お腹いっぱい。
01/12/13 00:12ID:???そこまで古くない
0167名無しさん@お腹いっぱい。
01/12/13 00:37ID:???0168名無しさん@お腹いっぱい。
01/12/13 01:30ID:???0169JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/13 03:25ID:???求めているものとは異なると思うけど。
s{\s*((?:\\\S|\\\s|\S)+)\s*}{push @x, $1; $x[-1] =~ s/\G([^\\]*)\\(.)/$1$2/g}eg;
0170名無しさん@お腹いっぱい。
01/12/13 07:49ID:kld8XmGBs///の中にs///いれちゃうってのがおもしろい。
級数的に遅くなっちゃうんだろうけど...
0171名無しさん@お腹いっぱい。
01/12/13 07:53ID:kld8XmGB二つ目は s/\\(.)/$1/g で良いような。
my %escape = ( n => "\n", r => "\r"... );
s{\s*((?:\\\S|\\\s|\S)+)\s*}{push @x, $1; $x[-1] =~ s/\\(.)/$escape{$1}||$1/eg}eg
0172名無しさん@お腹いっぱい。
01/12/13 08:01ID:kld8XmGB# だぶるくおーと
s{\s*"((?:\\[^"]|\\"|[^"])+)"\s*}{push @x, $1; $x[-1] =~ s/\\(.)/$escape{$1}||$1/eg}eg
# しんぐるくおーと
s{\s*'((?:\\[^']|\\'|[^'])+)'\s*}{push @x, $1; $x[-1] =~ s/\\(.)/$escape{$1}||$1/eg}eg
ひとつにまとめたーい
\s*('|")((?:\\[^\1]|\\\1|[^\1])+)\1\s*
うーー。[^\1]って動くのか?
今Perlなし環境なんでためせん....
0173JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/13 08:50ID:???何やってるんだろ。
ちなみに、HTMLでは属性値の "..." 内に 「"」を入れたいときには「\"」を
使いません。もちろん、「\n」と書いても改行にはなりません。
あと、欲張りではない .*? とか .+? を使うともう少し簡単に書けそう。
('|") は ['"] と書いた方が微妙に良いかも。
----
どうせなら思い切りトリッキーに
s{\s*((?:\\.|\S)+)\s*}{($x[@x] = $1) =~ s/\\(.)/$1/g }eg;
とか。:-p
# 良く考えたら \\\S|\\\s って \\. ですよね。
そろそろ寝ます。
0174名無さん@お腹いっぱい
01/12/13 10:04ID:MWbyUPNC" を使うのが正解なのかな?
<a title="get it from \"snake hole\"">spank spank</a>
<a title="get it from "snake hole"">spank spank</a>
改行を含める場合はどうしたらいいんだろう...
正規表現パート。
('|") と ['"] はどう違うんだろう。
選択と文字クラス(?) の違い?
諸説正規表現あたり読むとわかるんだろうか。
とりあえず、.+? を使って、
\s*['"]((?:\\.|.)+?)\1\s*
にすることにしました。イロイロサンクス!
0175名無しさん@お腹いっぱい。
01/12/13 10:05ID:???"を使うのが正解です。
0176174
01/12/13 10:59ID:MWbyUPNCあれー? & と quot と ; を書いたはずなんだが... 2ch だと変換されちゃうのか。
もう一個。
今日は(*そりゃもう死ぬほど(ってほどじゃないけど))寒い。
みたいなので、 "(*" から ")" まで一発でマッチさせることって出来ないかな。
ネストしてた場合ってループで処理するしかないのだろうか...
0177JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/13 16:38ID:???> 改行を含める場合はどうしたらいいんだろう...
<a title="Mermione
moe">hoehoe</a>
とか。
> ('|") と ['"] はどう違うんだろう。
> 選択と文字クラス(?) の違い?
です。後者の方がバックトラックが発生しないので効率が良いです。
(この場合はそれほど違いは無いですけど。)
>>176
perl5.6以降限定作戦。
$_ = "foo (Hermione (Emma Watson) moe) bar";
$regex = qr/\((?:(??{$regex})|.)*\)/;
($match) = /($regex)/;
print "$match\n";
0178174
01/12/13 19:54ID:???そろそろ尊敬しちゃっていいですか?
でも、
% perl -v
This is perl, version 5.004_05..
なので、諦めて寝ます。
0179JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/13 21:54ID:???$regex = qr/\((?:(??{$regex})|.)*?\)/;
($match) = /($regex)/;
こうしないと欲張りマッチになってしまう。
2重まで限定で良ければ、($match) = /(\((?:\(.*?\)|.)*?\))/;
3重まで使いたければ、($match) = /(\((?:\((?:\(.*?\)|.)*?\)|.)*?\))/;
ってのはダメ?
もちろん、(??{ CODE }) 使った方は何重でも使えます。
0180ぴこ
01/12/14 02:30ID:LSCy87gy無くすには、どうすればよいのでしょうか?
$piko =~ s/^[.\n\s ]*//g;
これで無くすと?がHに化けてしまうんです・・・
0181名無しさん@お腹いっぱい。
01/12/14 03:06ID:???同じくらいのレベルの俺だけど…
$piko =~ s/^(?:\s| |\n)+//g;
0182ぴこ
01/12/14 03:34ID:LSCy87gyおぉお〜出来ました感動です!
かなり不安でしたが2chに書き込みしてみてよかったです。
自分の勉強不足が身にしみました
ただ、全角スペースが||で囲まれている理由が
全く分らないのでCGI&Perlポケットリファレンスを
片手に、がばってみます。
このような質問に丁寧に答えていただき
真に有難う御座いました。
0183JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/14 03:56ID:???$piko =~ s/^[.\n\s ]*//g;
これは、ソースコードが Shift_JIS で書かれている場合、
$piko =~ s/^[.\n\s\x81\x40]*//g;
と等価になります。
で、さらに言うと、
* (いわゆる) 全角スペースは Shift_JIS で "\x81\x40" です。
* Perlでは原則的に文字列をバイト単位で扱います。
* "?" は Shift_JIS で "\x81\x48" です。
頑張ってください。
あと、このままだと先頭の "." まで削除しちゃいます。
# 文字クラス [...] 中では多くのメタ文字はそのメタ性を失うため。
----
あと、本は少し高いけど「プログラミングPerl改訂版」が良いと思います。(
中身はperldoc に全部載っていますが、本の形態である方が最初のうちは何か
と便利です。)
0184174
01/12/14 13:56ID:eAyIvKrjやりたいことってのは、
普通の文章の中にあらわれる (...) を切取るって作業なんです。
でも、普通の文章の場合、(...) の中に単体で '(' とか ')' が出ることもあるか...
諦めます。
0185名無しさん@お腹いっぱい。
01/12/18 00:11ID:lPs5lnwvあるってどこかで見て一度見てみたいんだけどgoogleで調べても出てこない。
だれか、コード or コードを載せてあるページ知ってる人いない?
恥ずかしながら、どうやって解いているのか見当もつかない。
0186名無しさん@お腹いっぱい。
01/12/18 00:31ID:???0187名無しさん@お腹いっぱい。
01/12/18 00:39ID:???人食い族と宣教師がボートに乗って川を渡る
とかいうやつじゃないの?
0188名無しさん@お腹いっぱい。
01/12/18 01:14ID:???スマン。
問題書いてなかったね。
3 人の宣教師と 3 人の人喰い土人が川の左岸にいます.
1 隻の 2 人乗りボートを使って,
右岸に渡るにはどうすれば良いでしょうか?
ただし土人の人数が宣教師の人数よりも多くなると,
宣教師は喰われてしまいます
という問題。
0189名無しさん@お腹いっぱい。
01/12/18 01:52ID:???0190名無しさん@お腹いっぱい。
01/12/18 02:36ID:???でプログラム技術板で解いてたとか。(18,52あたり)
ちょっと違う問題っぽいけど。
肝心のムの板スレは見つからず・・・
0191190
01/12/18 02:41ID:???0192名無しさん@お腹いっぱい。
01/12/19 00:58ID:???おもしろそうだから探してみたけど見つからなかった (-v-;
正規表現のコンパイラを上手く使って分岐するのかな?
と言うかこの問題ニ分木で解いたけど難しかった。。。
0193名無しさん@お腹いっぱい。
01/12/19 19:57ID:iZmRvdOPまとめようと思いました。IEのバージョンとwinのバージョン以外は無視するつもりで
/MSIE.*5\.5.*Windows.*98/
とやっても
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
などにマッチしてくれません。正規表現道場の師範の方々にご教授願いにあがりました。
環境はActivePerl(perl5.6.1 built for MSWin32-x86-multi-thread) on Windows2000proです。
一応分け方としてはMSIE5.01, 5.0, 5.5, 6.0とWindows 95, 98 ,NT5の組み合わせを
考えています。
#それにしてもヴァージョン違いの多さにあきれてしまいます。そういえばMeがでてきません。
#98の3rdエディションともでていなかったけど
0194名無しさん@お腹いっぱい。
01/12/19 20:11ID:1HBNd19Z最短は何手なの?
自分も解いてみたけど13手だった。
0195JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/19 20:56ID:???マッチしますが?
0196名無しさん@お腹いっぱい。
01/12/19 21:53ID:FzZSVld0コーディングの問題でした。
処理が下に抜けていた。
修行し直します。
0197名無しさん@お腹いっぱい。
01/12/20 17:08ID:???例えば、/\d+/とかだったら、0、/\d+\w+/だったら、0aとか。
0198JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/20 18:04ID:???0199名無しさん@お腹いっぱい。
01/12/20 23:34ID:???0200名無しさん@お腹いっぱい。
01/12/20 23:46ID:dNXMf8EIちょっと違うけど。
問題クレクレ
http://piza.2ch.net/tech/kako/989/989687023.html
船渡し問題
http://piza.2ch.net/tech/kako/990/990503990.html
スクリプト
$_='i=FMBBGGSD;@n=(F,M,B,G,S,D);Yp{_X!(/D/&!/S/&/[^D]/|/F/&/G/&!/M/|/M/&/B/&!
/F/)}Yz{_X!_|/[FMS]/}Yr{aXbXp(a)&p(b)&p(a.b)&z(b)}Yt{my(@o,c,d,e,f,g,h,i,j);c=k
%2;e=iXf=jXif(c&!f){push@m,join"\n",@l,k,"";return}_=e;y/FB/MG/;return if Z&Z<=
k;Z=k+1;@o=(@n,"");for g(@n){shift@o;for h(@o){e=i;d=g.h;f=j.d;next if e!~s/g//
|h&e!~s/h//|!r(e,d);a="e->d j";a="j d<-e"if c;push@l,a;k++;t(f,e);k--;pop@l;}
}}t i;print@m,@m+0';s/X/=shift;/g;s/Y/sub /g;s|Z|\${c}{join"",sort split//}|g;s
/[|&]/$&$&/g;s/\b[_-k]\b/\$$&/g;eval
0201名無しさん@お腹いっぱい。
01/12/21 02:38ID:???■ このスレッドは過去ログ倉庫に格納されています