トップページ⇒php
1001コメント313KB

正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/11/19 21:42ID:Kst3Nn4S
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、&amp " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
0527nobodyさん04/07/19 12:29ID:???
>>515
宣伝してるのはお前か?
http://pc5.2ch.net/test/read.cgi/hp/1089046899/39
http://pc5.2ch.net/test/read.cgi/hp/1065089862/324
0528nobodyさん04/07/19 12:43ID:???
手持ちのエディタで検証してみたところ
・PeggyPad
 うんともすんとも
・PHPエディタ
 普通の文字、または左括弧"("が必要です.
と出ました。しょぼーん。

秀まるお使ったほうがいいですかね?


>>527
http://www.google.co.jp/search?num=50&lr=lang_ja&ie=Shift_JIS&oe=Shift_JIS&q=infoseek
で一番上に来るサイトを選んだだけです。とりあえず否定しときますです。
0529nobodyさん04/07/19 13:26ID:???
秀丸も正規表現エンジンを変えてやったけどできなかった。
ローカルのperlを利用するマクロならできたけど。

で、マッチしたとして何をしようってのよ?
保存したソースから削除とかなら複数行置換えできるフリーソフトのほうが簡単だぞ。
0530nobodyさん04/07/19 21:20ID:???
ローカルプロキシです。
あっちのスレにも誤解されそうな人がいますが…
0531nobodyさん04/07/19 23:57ID:???
>>529
秀丸がダメなのはヘルプに説明があるよ。
(「検索系コマンド」の「\nを使った複数行検索の際の制限について」)

>>530
エディタのマクロかなんかでプロキシ作るのかい?
0532nobodyさん04/07/22 12:26ID:???
ローカルプロキシって、まさかおみとろんでは...
0533nobodyさん04/07/22 14:35ID:???
ああ、なるほど
広告を非表示にしたいわけか
0534nobodyさん04/07/24 14:34ID:wErUOaoh
文中に自動リンクをしたいのですが、Googleの検索結果のようなめちゃくちゃ長いURLを短くして表示することは出来ますか?

$str = "googleの結果<br>ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&q=ereg_replace&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja<br>..."
$str = ereg_replace("http://[^<>[:space:]]+[[:alnum:]/]","<a href=\\0>\\0</a>", $str);

これをこのように出力したい。
<a href=ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&q=ereg_replace&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja>ttp://www.google.co.jp/search?hl=ja&ie=...</a>
0535nobodyさん04/07/24 14:51ID:???
>>534
$strからgoogleの結果<br>と<br>を取り除いてから
<a href=$str>ttp://www.google.co.jp/search?hl=ja&ie=...</a> でいいだろ。
0536nobodyさん04/07/24 15:12ID:wErUOaoh
早速のレスありがとうございます。

$str はいわゆる掲示板の書き込みのコメント部分です。
で、それを自動リンクしたいんですが、コメント中に長いURLを張るとテーブルが壊れます。
実際のリンクは超略しないで、表示部分だけ短く省略したいんです。
0537nobodyさん04/07/24 16:35ID:???
$str = ereg_replace("http://[^<>[:space:]]+[[:alnum:]/]","<a href=\\0>リンク</a>", $str);
0538nobodyさん04/07/24 17:11ID:wErUOaoh
ttp://ns1.php.gr.jp/pipermail/php-users/2002-April/007102.html
ヘボイらしいのですが、ここを参考にして何とかなりました。
お騒がせしました。
0539nobodyさん04/07/24 23:27ID:b6ZQFx0g
<table> の中の、入れ子構造になっている セルを抽出する方法を教えてください


      <table> <tr> <th> TH1 </th> <td> TD1 </td> </tr> </table>
      <table> <tr> <th>
                 <table> <tr> <th> TH2 </th> <td> TD2 </td> </tr> </table>
                 TH3 </th> <td> TD3 </td> </tr> </table>

欲しいものは、
TH1 と TD1
TH2 と TD2
<table> <tr> <th> TH2 </th> <td> TD2 </td> </tr> </table> TH3 と TD3
です

環境は php4.3 です
0540nobodyさん04/07/25 01:22ID:???
入れ子になっている構造は正規文法で表せません
0541nobodyさん04/07/25 04:31ID:???
xslt とかの方が向いてそうだな
0542nobodyさん04/07/25 06:16ID:???
>>539
http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
0543nobodyさん04/07/26 14:57ID:nr00S6gf
「test.html#aiueo」「abc.jsp#123」という文字列があって
#の前の文字列を取得したい場合はどのような正規表現にすれば良いのでしょうか○| ̄|_
0544nobodyさん04/07/26 15:12ID:???
>>543
^([^#]*)
^(.*?)#
0545nobodyさん04/07/26 15:18ID:???
>>544
ありがとうございます○| ̄|_
うー、もっと勉強しなければ。(*)#とかしてますた。
0546nobodyさん04/07/28 01:04ID:???
xmlで
------------------------
<qqq>
  <abc>123</abc>
  <rrr>aiueo</rrr>
  <abc>456</abc>
</qqq>
------------------------
というような構造のとき、
<qqq>の中の文字列を取り出し
それに対して
/<abc>([^&]+)<\/abc>/
でマッチング処理を行うと、
------------------------
123</abc>
  <rrr>aiueo</rrr>
  <abc>456
------------------------
という結果になってしまいます。
一つ目の<abc>123</abc>に正しく反応させたいのですが
どのようにすればよいのでしょうか。
よろしくお願いいたします。

※マッチング処理の際の
 /<abc>([^&]+)<\/abc>/
 のabc部分は可変です。
0547nobodyさん04/07/28 01:24ID:???
>>546
基本だと思うけれども最小マッチ
/<abc>([^&]+?)<\/abc>/
0548nobodyさん04/07/28 01:37ID:???
>>547
546です。すみません、本当に助かりました。
ありがとうございます。
(とほほさんのHP見ながらやっていたんですが、それ以外にも対応していたり
 するんですね。今後は気をつけます。)
0549nobodyさん04/07/28 01:37ID:???
だからとほほはアテにならない。
0550nobodyさん04/07/28 02:00ID:???
XMLなら正規表現使わずともDOMやSAXで抽出できるんじゃないの
0551nobodyさん04/07/28 02:36ID:???
>>550
むしろそっちの方が正攻法な気も。
0552nobodyさん04/07/29 00:49ID:???
>>547
546ではないけど質問です。

/<abc>([^&]+?)<\/abc>/
だと<abc>123</abc>にはマッチするけど、<abc><123></abc>マッチしませんでした。
こういう文字コードを使われてるものもマッチさせる方法はあるんですか?
0553nobodyさん04/07/29 09:01ID:???
ヴァカには使えない仕様です。
055455204/07/29 10:14ID:???
ごめんなさい、きちんと表示されてませんでした。

<abc>&lt;123&gt;</abc>

↑は/<abc>([^&]+?)<\/abc>/でマッチしないのですが、
マッチさせる方法はあるのですか?
0555nobodyさん04/07/29 10:24ID:???
>>554
[^]の意味を調べたほうがいいよ。
/<abc>([^<>]*)<\/abc>/
0556nobodyさん04/08/01 14:12ID:???
例えばですが、
$aには、変動する数字が代入されているとします。

【$aが、2000で割り切れる値であるとき、真を返す】

もしくは、

【下4桁が、2000・4000・6000・8000・0000のいずれかであるならば、真を返す】

としたい場合には、どのようなソースになりますか?

ご教授お願いいたします。
0557nobodyさん04/08/01 15:25ID:???
正規表現なんか使わずに素直に
$a%2000
じゃダメなのか?
0558nobodyさん04/08/01 15:30ID:???
print $a =~ /[02468]000$/
? 'つるー'
: 'ふおるす';

でもやっぱり $a % 2000 だよなぁ。。。@こっちの方が遅かったりして。
0559nobodyさん04/08/01 15:57ID:???
>>557
>>558
なるほど。割って0になるかどうかで/
どっちが早いですかねー。
あんまり変わらない??
0560nobodyさん04/08/01 16:44ID:???
>>559
特に速度が肝にならないのであれば、
「意味」がわかりやすいコードを採用するべきだと思う。
なのでふつーは $a % 2000 とするんじゃないかな。
0561nobodyさん04/08/01 19:57ID:???
>>560
ご丁寧にありがとうございます!
勉強になりました♪
0562nobodyさん04/08/03 16:53ID:???
htaccessでRedirectMatchを使ってページを
log.apディレクトリ以外にアクセスした場合にのみ、転送させたいのですが
正規表現がよくわからずお手上げ状態です。
どなたかヒントだけでもいいので教えていただけないでしょうか
0563nobodyさん04/08/03 16:58ID:9nB7Zn3+
RedirectMatch [^log.ap] http://
0564nobodyさん04/08/03 17:00ID:???
>>563
それじゃ無理だよ
0565nobodyさん04/08/03 17:08ID:9nB7Zn3+
RedirectMatch [^|log.ap|] http://

こうか?
0566nobodyさん04/08/03 17:10ID:???
>>565
もっと違う
0567nobodyさん04/08/05 19:56ID:???
いきなり質問です!
Perlで&を&amp;
に変えた後
if($message =~ /http:\/\/([a−zA−Z0−9¥.¥/¥−+#_?〜&¥%=^¥@:¥;]+)/i){
$1 =〜 s/amp¥;//g;
}
で&amp;から&に直しました。。
しかし$1の行でエラーが出ます。
さて、どうしてですか?
0568向こうで答えた者04/08/05 20:33ID:???
>>567
なんだ、マルチかよ!
0569nobodyさん04/08/05 20:39ID:???
>>568
向こう見てから、こっち見たからワロタ
0570nobodyさん04/08/05 23:09ID:???
まさか全角文字使って・・・
と、釣られてみる
0571nobodyさん04/08/06 00:32ID:???
すいません、マルチのつもりは無かったのですが。
もし不快感を催したのであれば、心からお詫び申し上げます。

しかし、私がこれを記していない事は確かです。
語調、時間差での間違いからそれは明らかです。
それを理解の上でのご返答・ご指摘宜しく御願致します。
0572nobodyさん04/08/06 12:07ID:4bPJPC+C
性器豹変
0573nobodyさん04/08/06 16:26ID:???
>>571
ネタ?
0574nobodyさん04/08/06 17:13ID:???
s/煽り|荒らし/あぼーん/g
0575nobodyさん04/08/06 22:55ID:???
"/煽り|荒らし/","あぼーん" 自慰が気になる。なに?
0576nobodyさん04/08/06 23:00ID:???
>>575
>>121
0577nobodyさん04/08/07 03:48ID:???
>>575は g スイッチのことぢゃないの?
確か global の略だったと思う。
パターンにマッチしたのは全部片付けちまいな、の意。

# >>576がなんで >>121 を指してるのかが気になる。
0578nobodyさん04/08/09 18:35ID:???
perlの正規表現で
$value = qq|<a href="hogehoge.html">test</a>|;
$value =~ s/<.*?>//g;
print $value;

でHTMLタグを削除できるけど、これの仕組みがわからない。
*→0回以上一致する
?→0回または1回一致する
.→???????

エロイ人解説おながいします
057957804/08/09 18:44ID:???
.→改行以外の一文字に一致する

見てた解説サイトにだけちょうどなかったorz

でも*?とする意味はまだわからないでつ;
0580nobodyさん04/08/09 18:45ID:???
>>578
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlre.html
058157804/08/09 19:05ID:???
>可能な限り小さな 繰り返しでマッチを行わせたいのなら、量指定子の後に“?”を続けます。

>>580
どうして?を付けるとそうなるのかが・・・・
例えば
$test = "<aiu>test</aiu>";
$test =~ s/<.*?>//g;
としたときに.*だけですべてをひとつの文字列として捉えそうなのに(現に?がないとそうなりますが)
?を付けるだけで・・・うまくいえないorz

?がコンパイルされる瞬間はいつなんですか?
<.*の時点で可能な限りマッチしますよね・・・っていうかその時は>これはあってもなくても<.*だけで
最後まで一致するから、じゃあ>はいつコンパイルされるんだ???

もしも
s/<<.*>>//g;
としたら先に<<>>を優先してあまった文字に対して.*をやるのかな?駄目だ・・これじゃ
漏れの疑問をエロイ人に理解してもらうことすらできないorz
0582nobodyさん04/08/09 20:25ID:???
>>581
*? で一塊の量指定子。量指定子としての * と量指定子としての ? を
並べて書いてるわけじゃない。

$test = "<aiu>test</aiu>"; として、

最長マッチ (<.*>) の場合:
1. $test の最初の < と パターンの < がマッチ
2. .* は「何か0文字以上を最大限」だから、aiu>test</aiu> にマッチ
3. パターンにはまだ > が残っているが、文字列は全部調べ尽くしたので
  一旦マッチ失敗。
4. .* は「0文字以上」でさえあればいいので、食べちゃった文字を一文字
 ずつ吐き出し、再試行できる (バックトラック) 。
5. .* にマッチした aiu>test</aiu> から最後の > を除外し、.* の次の
 パターンである > と比べる。
6. $test の最後の > とパターンの > がマッチ
7. パターンが全てマッチ ( < と aiu>test</aiu と > )

最短マッチ (<.*?>) の場合:
1. $test の最初の < と パターンの < がマッチ
2. .*? は「何か0文字以上を最小限」だから、( < と a の間にある) 空文字列
 にマッチ
3. a はパターン > にマッチしないので一旦マッチ失敗。
4. .*? は「0文字以上」でさえあればいいので、もっと詰め込む事もできる。
5. .*? に a を食わせる事にして、i と > を比べる。
6. 同様にパターン > が $test 中の > にぶつかるまで試行を繰り返す。
7. パターンが全てマッチ ( < と aiu と > )
0583nobodyさん04/08/09 21:34ID:???
ある文字列を含まない行を取得したいのですが、
どのようにしたらいいんでしょうか?
例)
aaabbb ERROR aaabbbccc ABC dddeee
aaabbbcc ABC cdddeee
ERROR aaabbbcccddd ABC eee
というようなテキストがあるとして
errorを含まずABCを含む行だけ(この例では2行目)を
マッチさせたいんですが。
0584nobodyさん04/08/09 21:44ID:???
>>583
http://www.din.or.jp/~ohzaki/regex.htm
^(?=.*ABC)(?:(?!ERROR).)*$
0585nobodyさん04/08/09 21:46ID:???
>>583
@match_lines = grep((!/error/i and /\bABC\b/), split /\n/, $Strings);
0586nobodyさん04/08/09 22:00ID:???
>>584, >>585さん、ありがとうございます。
しかし、教えてくださったやり方だと、自分の使っている
エディタ(Peggy)ではできないです。
これはPerlで使える方法なのでしょうか?
(Perl知りませんが。。。もしかしたらjavaの
OROとかでも使えるのだろうか?)
ちなみに秀丸エディタでは前方一致とか後方一致で
マッチさせることができるみたいですね。
そこまでいかない普通の?正規表現しか使えない環境でこれは
実現できないものでしょうか??



0587nobodyさん04/08/09 22:05ID:???
EmEditorならできるよ
0588nobodyさん04/08/09 22:22ID:???
>>587さん、ありがとうございます。
ちょっと見てみます。
でもすでにPeggyをシェアウェアとして長く使っており、
見やすい配色になれてしまったので、
今から乗り換えるつもりはないですが。。。
必要なときだけ使う形でいくしかないかな。
あ、でもこれ使用期限とかあるのかな。
0589nobodyさん04/08/09 22:30ID:???
フリーのVxEdtorの正規表現検索でも >>584 でできたよ。
059058104/08/10 07:09ID:???
>>582
うお!?
メチャクチャわかりやすい!
保存しておきまつ!
0591 04/08/10 13:43ID:2tv/OiLj
>>252
便乗させてください。

if ($FORM{'name'} !~ /^(\x82[\x9f-\xf1]|\x83[\x40-\x96]|[\x88-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/){ &error; }
↑
ここから漢字とひらがなも省いて「全角カタカナのみを許可」という形にするにはどうればよいでしょうか。
0592nobodyさん04/08/10 20:24ID:???
>>591
http://www.din.or.jp/~ohzaki/perl.htm#Character
0593nobodyさん04/08/11 20:21ID:???
>>592
ありがとうございました
0594nobodyさん04/08/12 12:26ID:wFKNBEiY
電話番号をsjisで正規表現するにはどうすればいいでしょうか?
080-1234-5678
とか
03-1234-4321
とか
080-1234-5678
とか
08012345678
とか
0312344321
0595nobodyさん04/08/12 13:04ID:???
[0-9-]*
0596nobodyさん04/08/12 14:16ID:???
>>594
080-1234-5678?
08-01234-5678?
08012345678?
0597nobodyさん04/08/12 14:23ID:???
どういう文字列を電話番号とみなすのか、話はそれからだ
0598nobodyさん04/08/12 19:55ID:???
>>594
/(\d{2,4})-(\d{2,4})-(\d{2,4})/

こんなんか?全角数字は先に半角に変換処理しとけ。
0599nobodyさん04/08/12 20:02ID:???
>>598
それじゃ
01-23-45
にも
0123-4567-8910
にもマッチしちゃうよ
ハイフンがない場合にはマッチしないし
0600nobodyさん04/08/12 20:11ID:???
>>599
>>597
0601nobodyさん04/08/12 20:31ID:???
>>597
>>594 がどこまでのものを求めているのかは知らんが、参考までに。
http://www.soumu.go.jp/joho_tsusin/top/tel_number/q_and_a-2001aug.html
http://search.cpan.org/~taniguchi/Number-Phone-JP-0.03/
http://perldoc.jp/docs/modules/Number-Phone-JP-0.03/JP.pod
0602nobodyさん04/08/12 23:02ID:???
0△       -×××× -□□□□
0△△     -×××   -□□□□
0△△△    -××    -□□□□
0△△△△  -×      -□□□□
0△△△△△-□□□□

0から始まる9or10or11桁
ex>09012345678 (携帯は11桁?)
  家電は9桁(例外)と10桁?

全角も含めると(?:\x82[\x4F-\x58])を入れてやる?
ムズイな
0603nobodyさん04/08/12 23:08ID:???
>>602
それ何コードだ?
0604nobodyさん04/08/12 23:18ID:???
>>602
SJISだろうよ
0605nobodyさん04/08/12 23:19ID:???
× >>602
○ >>603
0606nobodyさん04/08/12 23:30ID:???
バカかこいつは?
全角を半角に直すという処理をなぜ思いつかない
0607nobodyさん04/08/13 01:10ID:???
題意がわからんのでなんともいえないけど、
マッチした文字列をそのまま取り出す、
ということなら全角を半角に直しちゃまずいと思われ。
0608nobodyさん04/08/13 08:12ID:???
>>594を見ると数字の全角半角の混ぜ書きはだめなような気がする。
ハイフンはいいのかな?
0609nobodyさん04/08/13 09:18ID:???
>>606
バカかこいつは?
どうせクエリを受けたらEUCに変換するんだから、全角→半角処理などいらぬ。
0610nobodyさん04/08/13 09:57ID:???
>どうせクエリを受けたらEUCに変換するんだから、全角→半角処理などいらぬ。
大丈夫かコイツ・・・
061159404/08/13 10:22ID:???
大漁!
0612nobodyさん04/08/13 11:18ID:???
>電話番号をsjisで正規表現するにはどうすればいいでしょうか?
0613nobodyさん04/08/13 12:28ID:???
eucに変換後、数字とハイフンを半角に変換(↓参照)してハイフンを削除。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H
半角数字だけになれば何とでもなんだろ。
0614nobodyさん04/08/13 23:16ID:???
結局誰一人として「電話番号をsjisで正規表現する」ことのできない無能揃いの糞スレ。
0615nobodyさん04/08/13 23:29ID:???
なんでsjisなんだろう
この人内部エンコーディング分かってるのかな?
0616nobodyさん04/08/14 00:05ID:???
それ以前に、必死に煽れば答えを出してくれるという発想が痛い
0617nobodyさん04/08/14 01:37ID:???
>>615
近頃sjisで書いてるプログラムが多いからだろ
0618nobodyさん04/08/14 02:10ID:???
元質問者がいなくなったら放置しとけよ
0619nobodyさん04/08/14 02:39ID:???
>>614
>>614
>>614
>>614
>>614
0620nobodyさん04/08/14 10:24ID:???
>>619
恥ずかしいからやめとけ。
s/煽り|荒らし/あぼーん/g
これが鉄則
0621nobodyさん04/08/14 11:16ID:???
ここは道場だから、質問者ががんばらないといけないんだよ。
0622nobodyさん04/08/14 11:25ID:4Tdhf0SR
面白そうなスレなんであげとく
0623nobodyさん04/08/14 11:29ID:???
>>594=>>614だったらえらくえらそうな質問者だな。答える気なくした
0624nobodyさん04/08/14 11:42ID:???
>>602
全角含めるならまず置換して
最初はゼロ、1から5桁の数字、ハイフン一かゼロ、1から4桁の数字、ハイフン一かゼロと四桁の数字が1かゼロ
でそのまま答えでてるんじゃないの?
0625nobodyさん04/08/16 01:23ID:???
>>624
もう終ってるからどうでもいいが、言葉でごちゃごちゃ言うより実際のコーディング例を書いたほうが
100倍わかりやすい。まあ今回は質問者がクソだから、コーディング例など書かないでほしいが。
0626nobodyさん04/08/16 06:38ID:???
コードを理解できてないから質問するとばっかり思ってた。
■ このスレッドは過去ログ倉庫に格納されています