トップページ⇒php
981コメント301KB

正規表現道場@2ch Part4

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん05/01/17 11:51:25ID:SH1ygN1P
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、
どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

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

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/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/
0855nobodyさん2005/12/05(月) 20:21:42ID:???
>>852
普通にマッチするよ。ソースファイルはEUC?
encodeだかdecodeだかのサブルーチンが悪さしてるんでしょ。
つか、Yahooのhtmlは最初からeucなので、
そのdecodeとかいう処理が要らないのでは?
0856nobodyさん2005/12/05(月) 20:41:15ID:???
>>854
阿呆だな
0857nobodyさん2005/12/05(月) 21:08:26ID:???
>>854
すみません、短いとはどういう意味ですか?
0858nobodyさん2005/12/06(火) 02:42:19ID:???
>>853
前者はマッチした文字をキャプチャし、更に(aa|bb|cc)のようなものにも対応できる。
08598522005/12/06(火) 03:43:11ID:???
>>855
EUCでEncode使わなかったら出来ました。ありがとうございました_ _
0860nobodyさん2005/12/06(火) 08:48:42ID:???
>>858
サンクス
0861nobodyさん2005/12/06(火) 16:39:35ID:???
単純にa, b or cなら文字クラスのほうが早いと思うよ
0862nobodyさん2005/12/06(火) 22:55:04ID:???
Rubyなんですが、[] で括られた文字列を抽出するのはどうしたらいいでしょうか。
・[]はネストできる。
 "xxxx[123[45]6[7]8]xxxxxx" の場合"[123[45]6[7]8]" を得たい。
・\[ とすることでエスケープできる。
 "[xx\]" はマッチしない。
 "[\\\[]" は全体がマッチする。
正規表現だけに頼らなければ問題ないのですが。。
0863nobodyさん2005/12/06(火) 23:05:28ID:???
そういうふうに書けばいい
0864nobodyさん2005/12/07(水) 00:04:58ID:???
正規文法では扱えないんじゃないのかな
0865nobodyさん2005/12/07(水) 00:24:16ID:???
>>864
何でよ
0866nobodyさん2005/12/07(水) 00:34:22ID:???
文脈自由文法じゃないと無理
0867nobodyさん2005/12/07(水) 00:48:55ID:???
例えば

\[(?:[^\[]*|\[[^\]\\\\]*(?:\\\\.[^\]\\\\]*)*\])*\]
0868nobodyさん2005/12/07(水) 00:49:26ID:???
こういうのはなんでNG?
0869nobodyさん2005/12/07(水) 00:58:07ID:???
>>867
[]]]]
こういうのにもマッチするけどいいのかな
0870nobodyさん2005/12/07(水) 01:08:36ID:???
いや、これだけだと他にも色々問題はあるけど
根本的に変遷取れないのはどれ?って話

鬼車の拡張は無しの方向で
0871nobodyさん2005/12/07(水) 01:12:12ID:???
最近はPCREでも再帰マッチサポートしてるね。
RubyはもうOnigurumaに変更されたんだっけ。
0872nobodyさん2005/12/07(水) 01:25:15ID:???
シラネ
最近勉強し始めたばっかだし
解がもとまるかどうかすぐ分かるくらいになりてえ
08738622005/12/07(水) 01:26:25ID:???
>>867
[]の数は等しくないとまずいです
等しくなくてもいいのならば
\[.+([^\\](\\\\)*)\]
になりませんか?
0874nobodyさん2005/12/07(水) 11:18:55ID:???
電信八号というメーラーを使っていまして、海外からのスパむがうるさくて
かなわないので、「subjectに2バイト文字が含まれないもの」を振り分けたい
だけど、正規表現でどう書くのかわかりません。

subject で始まる行が1バイト文字だけで構成されている。
にマッチで良いと思うんですが・・・・
0875nobodyさん2005/12/07(水) 11:36:31ID:???
>>874
コミュニティは黄泉がえるか メーラー電八スレッド
http://pc7.2ch.net/test/read.cgi/software/1112876529/
0876nobodyさん2005/12/07(水) 11:58:35ID:???
/^FROM:.*mag2/i magmag.FLD

FROM:で始まる行にmag2という文字列が含まれていたら、
magmag.FLDに振りわけてる。

/^Subject:1バイト文字のみの1回以上の繰り返し spam.FLD
どうかくの?
0877nobodyさん2005/12/07(水) 12:02:37ID:???
>>874
POPFileでも使った方がはやいかも
0878nobodyさん2005/12/07(水) 12:17:30ID:???
アルファベット若しくは半角数字、半角記号が一回以上繰り返される場合、でいいのかな。
0879nobodyさん2005/12/07(水) 12:18:12ID:???
/^subject:[ a-z0-9その他記号等]+/i spam.FLD

もし使えたら[\x20-\x79]+とか
0880nobodyさん2005/12/07(水) 12:26:13ID:???
>>878
> アルファベット若しくは半角数字、半角記号が一回以上繰り返される場合、でいいのかな。
そのとおりです。お願いします。お手数お掛けします。
0881874=876=8802005/12/07(水) 12:27:39ID:???
ちなみにPOPFileは大嫌い
0882nobodyさん2005/12/07(水) 12:31:35ID:???
>>881
>>879
0883nobodyさん2005/12/07(水) 12:38:58ID:???
>>881
マニュアル読むのも大嫌いそうだな。
http://denshin8.esprix.net/den8help/V32.1.5.3/html/usage/folder/regular_expression.htm

ソフトの設定方法なんて WebProg と関係無いし、電信八号が
正規表現エンジンに何を使ってるのかも分からんから、ここで
尋ねるより専用スレに行った方が的確な答がもらえると思うが。
08848812005/12/07(水) 16:14:28ID:???
>>883
> マニュアル読むのも大嫌いそうだな。
すいません。ご指摘のとおりです。
助かりました。


おはずかしい。しかし望む動作はだいたい実現しました。
/^subject:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789!"#$%&'@+]*/i spam.FLD
08858812005/12/07(水) 16:17:53ID:???
「正規表現」でスレタイ検索したらココが一番アクティブだったので、
スレ違いを承知で質問させてもらっちゃいました。スレ違いスマソ
0886nobodyさん2005/12/07(水) 17:19:59ID:???
初々しい奴じゃな
0887nobodyさん2005/12/07(水) 17:33:04ID:???
過疎板は優しい人が多い。
0888nobodyさん2005/12/09(金) 00:38:44ID:iCbRbzp1
数字 小数点あり 0以上

という正規表現を実現したいのですが、何かいい方法ありませんか?

0.000000000(永久につづく) 以上っていう書き方が思いつきません・・・・。
0889nobodyさん2005/12/09(金) 00:52:32ID:???
てか、正規表現のやり方が分からないなら。
それが数値にマッチするかを調べて、0以上かの判定はスクリプトなり何なり使えば・・
0890nobodyさん2005/12/09(金) 01:16:43ID:???
なんでもかんでも正規表現にすればいいってもんじゃないぞ
0891nobodyさん2005/12/09(金) 01:23:27ID:???
まだ習いたてだけど、このような意味?

([1-9][0-9]*|0)\.?[0-9]*[1-9]
08928912005/12/09(金) 01:24:34ID:???
あっ、ちがうわ。
08938912005/12/09(金) 09:10:57ID:???
これでどう?

([1-9][0-9]*|0)(\.[0-9]*[1-9])?
0894nobodyさん2005/12/09(金) 10:21:46ID:???
1.0は数字じゃないの?
0895nobodyさん2005/12/14(水) 12:30:18ID:3LtPjEbb
数字にきまってんじゃんかよ、あんたアフォ?
0896nobodyさん2005/12/14(水) 12:58:51ID:???
>>888
([1-9]+[0-9]|[1-9])(\.[0-9]+)?|0+\.0*[1-9]

>>895
( ´_ゝ`)フーン
0897nobodyさん2005/12/14(水) 13:52:46ID:???
^(([1-9]+[\d]*)(\.[\d]+)?|0\.[\d]+)$
0898nobodyさん2005/12/14(水) 13:54:14ID:???
+が一個余計だったわ。
0899nobodyさん2005/12/14(水) 14:00:47ID:???
>>897
> 数字 小数点あり 0以上

だから0.0を通してはだめでは?
0900nobodyさん2005/12/14(水) 14:14:29ID:???
0+\.かつ^$でマッチ可否の判定をするなら
^([0-9]*[1-9][0-9]*(\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$

つーか>>888で「0以上」って0含んでもいいじゃん
「0を越える」の間違いだな
0901nobodyさん2005/12/14(水) 14:41:58ID:???
オー ニホンゴ ムズカシィネ
0902nobodyさん2005/12/15(木) 20:55:26ID:???
Finalという文字列から始まらない行にマッチする正規表現を書きたいんですが
^[^Final].*\r?
と書いた所何もヒットしないんですが
自分では「先頭が」+「Finalでない」+「何でもOK」+「改行」
と書いているつもりなんですが…
どこがおかしいのか教えて下さいまし
0903nobodyさん2005/12/15(木) 21:00:09ID:???
[^Final] は F, i, n, a, l 以外の文字
0904nobodyさん2005/12/15(木) 21:27:27ID:???
>>903
否定したさに[]にいれてしまった…。
ttp://www.sixnine.net/regexp/
をみながらやってたんですが
{}、/(/)等の中では^は否定にはならないですか?
0905nobodyさん2005/12/15(木) 23:40:50ID:???
>904
一般的な正規表現に文字「列」の否定はありません。Perl には ?! あるいは ?<! といった拡張が存在しますが。
プログラム中で使おうと思っているなら、先頭が Final で始まる行を正規表現で引っかけて、それ以外、とするのが簡単だと思います。
Perl だと↓な感じで。
print "NOT FINAL\n" if $str !~ /^Final/;

むりやり正規表現で表すなら ^([^F]|F[^i]|Fi[^n]|Fin[^a]|Fina[^l]).*\r? になるんじゃないかと。
0906nobodyさん2005/12/15(木) 23:45:53ID:???
>>905
丁寧に解説して頂きありがとうございます
今回はJ-editというエディタ内で置換したかったのでプログラムではできなさそうですが
勉強になりました。
0907nobodyさん2005/12/16(金) 00:10:03ID:???
Perlでローカルのファイルは変更出来ないんだっけ?
0908nobodyさん2005/12/16(金) 00:13:11ID:???
出来るがスレ違い
0909nobodyさん2005/12/16(金) 05:39:59ID:???
>>905
エディタがサポートしてないとしたら仕方ないが、その正規表現は泥臭すぎる……
サポートしてるなら「^(?!Final).*$」がいいんじゃないか。
0910nobodyさん2005/12/16(金) 14:20:34ID:3Jn+fCoS
phpで〜(にょろ)を正規表現で表すと何になりますか?

$val = "<TD>1000〜</TD>";
preg_match_all("/<TD>(.*)〜<\/TD>/", $val, $name);

とすると $name[0][1]には1000〜となり〜が入ります。
これをぬこうにも

$name2 = str_replace("〜", "", $name[0][1]);

$name2 = 1000〜となり〜が取れません。



0911nobodyさん2005/12/16(金) 14:26:41ID:???
>>910
mb_ereg_replace
0912nobodyさん2005/12/16(金) 14:33:08ID:???
何だこいつら?
0913nobodyさん2005/12/17(土) 23:21:43ID:9ZVQMdkG
s/(^-^;)/(-_-#)/g;
0914nobodyさん2005/12/18(日) 02:15:55ID:E4qxneT1
海外から掲示板を荒らされて困ってます。
2バイト文字を全く使っていない書き込みはendにしたいのですが、
どのように表現したらいいのでしょうか?

どうぞよろしくお願いします。
0915nobodyさん2005/12/18(日) 02:24:24ID:???
>>914
「perlメモ」でググると幸せ
0916nobodyさん2005/12/18(日) 02:31:00ID:???
>>915

即レスありがとうございました!
全角文字の判別で検索すればよかったんですね!
0917nobodyさん2005/12/18(日) 22:17:36ID:???
>>916
全角文字の判別を知らなくても全てがASCIIの範囲ならはじくというのは
書けそうなものだがな...


0918nobodyさん2005/12/20(火) 20:28:35ID:???
FireFox 1.5 + GreaseMonkey 0.6.4 + Linkify
ttp://ftp.iasi.roedu.net/pub/mirrors/mozdev.org/greasemonkey/linkify.user.js

で,http://〜をttp://〜も対応させたくて

const urlRegex = /\b(https?:\/\/[^\s+\”\<\>]+)/ig;
をさらに日本語対応化させて
const urlRegex = /\b([^h])(ttps?:\/\/[^\s\”\<\>\/]+\w+\/?[!#-;=\?-~]*)/ig;

としてみたんですがうまくいかず...
ttp://〜をマッチさせる方法教えてもらえないでしょうか
0919nobodyさん2005/12/20(火) 21:23:10ID:???
JAVAで [ と ] を文字として扱い、
他の文字列とマッチングをさせたいのですが
どうすればいいでしょうか?
対象とする文字列は Mem[0]、Mem[1]…(以下、数字が増加)
になります。
正規表現の "Mem\[[0-9]*\]" で試したのですが、
上手くマッチしてくれませんでした。
何か良い方法があれば教えてください。
0920nobodyさん2005/12/20(火) 21:43:50ID:???
Javaで \[ を表現したければ \\[ とするべし。
09219192005/12/20(火) 21:51:53ID:jBM1u1uW
>>920
即レスありがとうございます。
ただ、 \\[ という書き方だと、
\[ (バックスラッシュ[) とマッチするような気がするのですが…
[ とマッチさせる場合は特別で、
バックスラッシュが二つ必要になるのでしょうか?
0922nobodyさん2005/12/20(火) 22:55:56ID:???
文字列 \ を表したければエスケープするということ。
詳しくは
ttp://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/regex/Pattern.html#bs
09239192005/12/20(火) 23:45:59ID:???
>>922
文字列として扱いたいのは\ではなく[と]の方です。
単に[と]を書くと、括弧の中に着目されてしまうので
\[や\]と書けば良いのかと思ったのですが、
この方法だとマッチしたという判定にならず。
他に記述方法があるのかどうかと…
分かりにくい質問でスミマセンでした。
リンク先、参考にしてみます。
0924nobodyさん2005/12/21(水) 00:18:26ID:???
>>923
リンク先を熟読してから文句をつけるように。

0925nobodyさん2005/12/21(水) 18:13:17ID:???
外部CSSを使ってHTMLを装飾しているのですが、
その外部ファイルにどんなものが定義されているかを
htmlのtable要素を使って一覧にしたいと思い、下記のようにしましたがパースエラーと出ました。

XXX {
 ○○○
}
とあるものを
<table>
 <tr>
  <td>XXX</td><td>○○○</td>
 </tr>
</table>
のように表示させたいのですがこの条件でマッチする表現を教えて頂けますか
0926nobodyさん2005/12/21(水) 21:38:17ID:???
s#(?:^|\n)([^\s\{]+)\s*\{\s+(\S+)#<table>\n<tr>\n<td>$1</td><td>$2</td>\n</tr>\n</table>#g
09279252005/12/21(水) 23:26:34ID:???
>>926
ありがとうございます。

下記のコードで試してみたところ
改行以降をひろってくれなかったのでちょっと改造にチャレンジしてきます。

-----------------------------
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<?
$lines = file('./hoge.css');
$file = implode('',$lines);

preg_match_all("/(?:^|\n)([^\s\{]+)\s*\{\s+(\S+)/",$file,$css);
for ($i=0; $i< count($css[0]); $i++) {
?>
<tr bgcolor="#9999cc">
<td><?=$css[1][$i]?></td><td><?=$css[2][$i]?></td><td><?=$css[2][$i]?></td>
</tr>
<?
}
?>
</table>
09289252005/12/22(木) 00:02:45ID:???
\sでスペース、\Sでスペース以外だったんですね。
最後の(\S+)を(.*)}?にして
"}が来るまでを最短マッチ"って書いたつもりでしたが.*は改行にマッチしないんですね…。
orz
むつかしいぃぃぃ
0929nobodyさん2005/12/22(木) 01:04:42ID:???
Perlだったら /s 修飾子をつければいい。
0930??2005/12/22(木) 06:00:17ID:VYb6VtoN
I can not write
0931??2005/12/22(木) 06:08:36ID:VYb6VtoN
I can not type Japanese now (this PC).
but I can read.
I use PHP.
I want to change every HTML tags in a file as follows:
<span class='test'>abcdefg</span>
->
<b><font color=#ff0000>abcdefg</font></b>
I tried
eregi('<span class="test">.*</span>', '<b><font color=#ff0000>.*</font></b>');
It does not work.
0932nobodyさん2005/12/22(木) 11:16:59ID:???
eregi ??
ereg-replace ?
0933??2005/12/22(木) 11:46:44ID:VYb6VtoN
soudesu
ereg-replace
desu
sumimasen
0934nobodyさん2005/12/22(木) 15:40:37ID:???
>933

http://jp2.php.net/manual/ja/function.ereg-replace.php

こんな感じでしょうかね?
$text = ' <span class=\'test\'>abcdefg</span>';
$text = ereg_replace('<span class=\'test\'>','<b><font color=#ff0000>',$text);
$text = ereg_replace('</span>','</font></b>',$text);
echo $text;


でも
http://jp2.php.net/manual/ja/function.str-replace.php に
「(正規表現んような)技巧的な置換ルールを 必要としない場合、
ereg_replace() または preg_replace()の替わりにこの関数を常用するべきです。」
ってあるね。
0935nobodyさん2005/12/22(木) 15:53:48ID:???
>>934
eregi_replaceで大文字小文字を区別しないってところが技巧的なんじゃないかな
09369252005/12/25(日) 16:01:19ID:???
結局正規表現で表すことが出来ずに"{"と"}"を両方とも"@@@@"に変換してから
@@@@でexplodeしてループ処理しました。
ヘタレだなぁ
orz
0937nobodyさん2006/01/04(水) 21:06:51ID:???
$aがメールアドレスかどうかPHPで簡単でいいのでチェックしたいのですが
if(ereg("[^0-9a-zA-Z@_\-\.]+",$a)){エラー処理}
だとうまくいかないようです。どこがおかしいのでしょうか?
0938nobodyさん2006/01/05(木) 13:07:16ID:???
あげ
0939nobodyさん2006/01/05(木) 13:10:56ID:???
>>937
http://www.japan.xitami.net/nsw/php/mailaddress.phtml
http://www.tt.rim.or.jp/~canada/comp/cgi/tech/mailaddrmatch/
http://www.din.or.jp/~ohzaki/perl.htm#Mail
09409372006/01/05(木) 15:17:17ID:???
>>939
ありがとうございます。参考にして試してみます。
0941nobodyさん2006/01/08(日) 16:38:18ID:???
時(1〜12)を正規表現であらわしたいのですが、
どうすればいいでしょうか?
[1-12]ではもちろんだめぽですよね・・・
0942nobodyさん2006/01/08(日) 16:42:11ID:???
{0,1}と?ってどっち使っても一緒?
0943nobodyさん2006/01/08(日) 16:43:23ID:???
>>941
そんだけの情報でダメかどうかなんて判断つかんだろ。
0944nobodyさん2006/01/08(日) 17:30:16ID:???
少なくとも [1-12] がだめなことは判断つくな(w
0945nobodyさん2006/01/08(日) 17:37:14ID:???
[1-9]|(1[0-2])?
0946nobodyさん2006/01/08(日) 18:03:28ID:???
[1-9]|1[0-2]
0947nobodyさん2006/01/08(日) 18:16:03ID:???
1[0-2]?|[2-9]
0948nobodyさん2006/01/08(日) 21:20:50ID:???
そういう類の質問は大概にして正規表現で何から何まで片付けようとしているのが間違いであることが多い。
0949nobodyさん2006/01/09(月) 05:39:24ID:DKtQK5nB
1-9と-(ハイフン)を指定する場合、
[1-9-]であってる?
それともエスケープしなきゃならんのでしょうか。
0950nobodyさん2006/01/09(月) 12:21:39ID:???
OK
0951nobodyさん2006/01/09(月) 16:46:54ID:???
hoge以外に一致させる場合どう記述すればよかとでしょうか?
[^hoge]だとhとoとgとe以外になってしまいますよね
0952nobodyさん2006/01/09(月) 17:32:03ID:???
そんぐらい自分で試行錯誤すりゃわかるだろ
少し自分で考え、実験してみてそれでもわからなくなったら質問しろ
0953nobodyさん2006/01/09(月) 17:46:24ID:???
$var = "<A>";
preg_match_all("/<A>/", $var, $array1);
preg_match_all("/A/", $var, $array2);
phpなんですが、$array2にはAが入ってるんですが、
$array1には<A>が入りません。

<>が問題ありなのは分かりますが、根本的理由が分かりません。
へるぷみー
0954nobodyさん2006/01/09(月) 18:06:11ID:???
>>953
結果の画面のソース見たらわかるんじゃないの
レス数が950を超えています。1000を超えると書き込みができなくなります。