正規表現道場@2ch Part4
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/17 11:51:25ID:SH1ygN1Pこのスレは有用そうな正規表現を紹介したり、
どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
註:& や " を書くときには、& " と描いておきましょうね。
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/
0175nobodyさん
05/02/17 02:44:37ID:???http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
0176nobodyさん
05/02/17 04:15:35ID:???0177174
05/02/17 11:15:34ID:???回答ありがとうございます。そこの正規表現である
tag_regex = '<!(?:--(?:(?!--).)*--(?:(?!--)[^>])*)*(?:>|$(?!\n)|--.*$)';
を利用したのですが、
"<!--------------------------->foo"
となっていると文字列全部を取得してしまいます。(fooの前まで引っ掛けて欲しい)
これがコメントとして間違ってることは理解しています。
しかし、こういう具合に間違ってるWebページは結構多いので、
これもコメントとして認識したいのですが
どうにかならんものでしょうか?
0178nobodyさん
05/02/17 11:34:14ID:???一回で全てしようとするから駄目なんだよ
0179nobodyさん
05/02/17 13:37:18ID:???これらに対応するのはキツイんじゃないかな
何回かに分けたとしても間違えてとったやつを弾くことは難しいわけで
0180nobodyさん
05/02/18 04:21:47ID:???0181nobodyさん
05/02/18 05:40:21ID:???0182nobodyさん
05/02/18 06:04:51ID:???Perlなら、>>147-148を利用して、
my $match = $str =~ m/($remark)|$sgml|$html/isg;
0184nobodyさん
05/02/18 12:08:09ID:4JcRNkuB0185nobodyさん
05/02/18 12:09:11ID:???0187nobodyさん
05/02/19 16:48:15ID:???0189nobodyさん
05/02/21 20:38:23ID:???RedirectMatch permanent (.*)\x20(.*) $1-$2
RedirectMatch permanent (.*)%20(.*) $1-$2
RedirectMatch permanent (.*)'%20'(.*) $1-$2
RedirectMatch permanent (.*)\x20(.*) $1_$2
RedirectMatch permanent "(.*) (.*)" $1-$2
全部だめ orz
0191nobodyさん
05/02/21 21:55:19ID:???いけました・・・
ありがとうございました
多分ブラウザのキャッシュか、.htacessに書く時点で間違えていたか、
どっちかだったと思います
0192nobodyさん
05/02/22 17:24:46ID:???1〜685の数字にマッチするように
6[0-8][0-5]|[1-5]\d\d|[1-9]\d|[1-9]
としてみたのですが、スマートというか
模範となるような書き方があったら教えてください
0193nobodyさん
05/02/22 18:33:44ID:???その正規表現が間違ってるのはともかくとして、
全部正規表現でやろうとせず、
文字列としての評価は [1-9]\d* くらいで検査しておいて、
あとは数値的に評価した方が良いと思われ。
0194nobodyさん
05/02/23 05:20:38ID:Vw9LlCLCID番号などは、半角数字というのもあって、簡単に取得できたのですが、
名前取得で手こずっています。
<td>名無しさん(17)<br><a href=show_friend.pl?id=774>
^^^^^^^^^^
を取得したいと思っています。
上記にマッチする正規表現例を教えていただけないでしょうか?
\<td\>(.*)さん\([0-9]+\)
これでは取得できていません。
0195nobodyさん
05/02/23 05:35:47ID:???rubyの文法を間違えていました。
ごめんなさいごめんなさい。。。
ちなみに上記の正規表現でOKでした。
0196nobodyさん
05/02/25 22:30:13ID:qCTUQzjg0197196
05/02/25 23:02:07ID:qCTUQzjgereg_replace( "/[^a-zA-Z0-9\s]/", "", $t )
何か勘違いしているでしょうか?
0198nobodyさん
05/02/26 01:29:40ID:EGev6g900199nobodyさん
05/02/26 01:31:43ID:EGev6g900201nobodyさん
05/02/26 06:37:59ID:???$t = ereg_replace("[^a-zA-Z0-9\s]", "", $t);
こういうこと?
それから、日本語扱うならmb関数にする。
0202nobodyさん
05/02/26 17:50:17ID:LErwwWXI大文字、小文字を区別無くマッチさせたいのですが、どうやればいいんでしょうか?
言語はPerlです。
$foo="[email protected]";
$bar="[email protected]";
このようなものが入っている場合、マッチさせたいのです。
0204nobodyさん
05/03/02 04:35:55ID:???"あいうえお「かきくけこ「さしすせそ「たちつてと」なにぬねの」はひふへほ」まみむめも」やゆよ「らりるれろ「「わをん"
↓こんな感じに
"あいうえお<em>かきくけこ<em>さしすせそ<em>たちつてと</em>なにぬねの</em>はひふへほ</em>まみむめも」やゆよ「らりるれろ「「わをん"
変換したいんですけど、どうすればいいんでしょう?
イメージ的には
/「[^「]*?」/
こういうことをしたいんだけど、[ ] の中はアスキーだけだし。
use encoding とかはナシな方向でひとつ。
0205204
05/03/02 04:49:22ID:???-------------------------
my ($s, $t) = (quotemeta '「', quotemeta '」');
$_ = "あいう〜";
s/($s)/\a$1/og;
while (s/ \a $s ([^\a]*?) $t /<em>$1<\/em>/ogx) { 1; }
-------------------------
とか 「 \a 」 で印つけてるけど、他にもいい方法あるかと思って。
0206nobodyさん
05/03/02 11:34:17ID:???私がやるとすればPerlメモ(ttp://www.din.or.jp/~ohzaki/perl.htm)にある
例を利用してあらかじめ
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
$char = qr{(?:$ascii|$twoBytes|$threeBytes)};
$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;
を用意しておいて、
1 while s{$eucpre(?:「((?:(?!「)$char)*?)」)$eucpost}{<em>$1</em>}o;
てな感じかな。キモは
[^」]を実現するのに、否定先読み+ASCIIまたはEUC1文字にマッチするパターンを使用
全体が1バイトずれてマッチしないように$eucpre,$eucpostを前後につけた
というあたりです。
0207nobodyさん
05/03/02 13:53:48ID:???タグの外にあるカタカナと『ー』の前後に半角スペースを入れたいのですが
(文字コードはEUC)
$t = preg_replace("/(?:^|(?<=>))([^<]*)((?:\xA5[\xA0-\xFF]|\xA1\xBC)+)/i","$1 $2",$t);
のようにすると、
例えば『七時のニュースです』という文字列の場合『ス』の前後にしか空白が入ってくれません。
どうにかして解決できないでしょうか……
0210nobodyさん
05/03/02 22:15:55ID:???指定部分だけを抜き出したいと思っています。
HTMLには<!-- BEGIN -->〜〜〜〜<!-- END -->というような
コメントが入っており、その中身だけを抽出したいと思っております。
まずfile関数で配列にすべてのHTMLを格納しimplideで結合します。
テスト用に以下のものを試しました。
$pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/";
$ary_data[] = "<!-- BEGIN -->\n";
$ary_data[] = "あいうえお\n";
$ary_data[] = "<!-- END -->\n";
$str_data = implode("", $ary_data);
preg_match($pattern, $str_data, $matches);
echo $matches[0];
改行コードが入っているとうまく抽出してくれません。
.*?の部分を[.\s]*?に変えてみたのですが変化がありませんでした。
どのように変更を加えればよいのでしょうか?
0211207
05/03/02 22:24:58ID:???0212nobodyさん
05/03/03 10:12:04ID:???$pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/s";
パターン修飾子 s をつけることで . が改行にもマッチするようになります。
0214nobodyさん
05/03/03 14:08:03ID:zkHMOcKeその文字列を別の文字列に置換するということをphpでやりたいのですが
$data = "aiu----hello----ncka";
$pattern = "/----(.*?)----/";
preg_match($pattern, $data, $out);
$data = preg_replace($pattern, "----goodbye----", $data, 1);
こうすると$out[1]にはhelloが入り、もとのデータ$dataの
----hello----が----goodbye----に置換されるというようにしているのですが、
同じ部分を検索しているのにもかかわらず
preg_matchとpreg_replaceを使っているので、もう少しいっぺんに同じ動作を
させることはできるでしょうか?
0215nobodyさん
05/03/04 20:58:51ID:gtJy+aSQ^(?:d+(?:.d*)?|.d+)$
と考えたけど、うまくいきません。
エロイ人、添削キボン
0217nobodyさん
05/03/05 05:18:05ID:???0218nobodyさん
05/03/05 08:15:13ID:8nW34nzC170
175.5
60
60.5
がOKで、
.6
15.15.52
なんてのがボツ
もちろん、数字と.以外がはいるとボツ
>>217
エラーになりますた
0219nobodyさん
05/03/05 08:36:43ID:???正規表現のスレでいうのもあれなんだが
数字として比較したほうがわかりやすいと思う
if ($height < 130 || $height > 200) print "Error";
0220nobodyさん
05/03/05 12:19:51ID:hbhM7+40$pattern = "/^[0-9]+?\.[0-9]+$|^[0-9]+$/s";
if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
0221nobodyさん
05/03/05 12:22:32ID:???$pattern = "/^[\d]+?\.[\d]+$|^[\d]+$/";
if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
0222nobodyさん
05/03/05 12:26:53ID:OYa1FD+rhttp://pochi-pochi.com/pages/index.php?refid=hopedkco
0223nobodyさん
05/03/05 13:35:01ID:???$string = "12.3.45";
$pattern = "/^\d+?\.\d+$|^\d+$/";
if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
?>
0224nobodyさん
05/03/05 19:27:01ID:???0225nobodyさん
05/03/05 20:43:45ID:???0226偽崎 博基
05/03/05 21:42:08ID:???0228nobodyさん
05/03/07 05:11:36ID:DaphPIkIhttp://www.abc.ne.jp/abc/abc.htmゴッゴル
コメント
http://www.nurupo.ne.jp/null/def.htm
ホゲホゲ
ホゲホゲ
ゲゲボ
http://www.g00.ne.jp/gero/ghijkl.htmまんくるぽ
ぬるぽ
http://www.mahoo.ne.jp/abc/mnopqrstu.htm
----------------------------------------------------
↑の文章がテキストに記述されてるとして、
「正規表現で置換を行いURL以外を削除する」
若しくは
「URLだけを抜き出す」
にはどうすればいいですか?
K2Editor と bregexp.dll を使用しています。
0232nobodyさん
05/03/10 10:04:14ID:Oal+cA17います?
他にどこできいていいものやらわからないので・・・。
Tepaエディターの正規表現でヒットする文字列がヒットしないんですけど、
具体的には
...:..:...ID:........$
という検索文字列を文字なしで置き換え、2chのスレッド内発言の時間とIDを削除しようとしています。
今日初めて正規表現のことを知って、美しくない検索かもしれませんが・・・。
と書きつつも231さんのIDがID:???であることを知った。
初めて見ました。
よろしくお願いします。
補足
BREGEXP.DLLを導入して、Speeeeedから正規表現が扱える状態になっています。
0234nobodyさん
05/03/10 10:25:23ID:Oal+cA17おっしゃりたいのでしょうか?
勉強してからこいとおっしゃりたい?
0236nobodyさん
05/03/10 14:06:21ID:???Speeeeed のホームページのサポート掲示板を「行末」とかで検索してみたら、
改行の扱いがどうもいまいちみたいね。
...:..:...ID:........\r\n
ってなかんじでどうでしょ。
0237nobodyさん
05/03/10 23:52:18ID:???ありがとうございます。
それでいけました。
>>235
正規表現が使える他のエディタではうまくいくので、
Speeeed固有の問題だと考えたけれど、>>1のリンク先には
その回答がなかったので・・・。
スレよごしすいませんでした。
0238nobodyさん
05/03/13 23:43:38ID:d9JNVB9S---
$txt = "mae http://hoge.jp mannaka http://abc.jp ushiro";
preg_match("/(http:\/\/[\w;\/\?:\@&=\+\$,\-\.!^\*'\(\)%#]+)/", $txt, $matches);
foreach ($matches as $tmp) {
echo $tmp."\n";
}
---
とすると、
---
http://hoge.jp
http://hoge.jp
---
となってしまいます。
http://hoge.jpとhttp://abc.jpを抜き出すためにはどうしたらよいのでしょうか?
0239nobodyさん
05/03/14 00:19:26ID:???http://jp.php.net/manual/ja/function.preg-match-all.php
0241nobodyさん
05/03/18 12:51:02ID:nYSabF1Kメールを処理するCGIをPerlで作っているのですが、ヘッダ部の
Subject:xxxxxx
を抜き出す方法がわかりません。
メールをヘッダ部とbody部に分け
if ($m_header =~/Subject:\s*(.*)/i){
$m_subject = $1;
}
だと、件名が長いときは切り落とされてしまいます。
Subject: =?ISO-2022-JP?B?GyRCPzclMyE8JUohPDMrO08hIzBsSmJAaCRyGyhC?= ←ここではなく
=?ISO-2022-JP?B?GyRCO0UzXSQxJGs0azZIJCskaSEiN1AxRCROGyhC?=
=?ISO-2022-JP?B?GyRCS1w8QSRyJEQkKyRgGyhCIChCeSBORUMgMjAwNS8yLzIxKQ==?= ←ここまでマッチさせたい
ttp://www110.kir.jp/study/jissen/script2130.html
の「タイトルの抽出」部分にある/MIME/文字列の$`だと、相手のメーラーに
よってはIn-Reply-ToやReferencesやMessage-Idなども件名に入ってしまい
うまくありません・・・。
0242nobodyさん
05/03/18 14:01:29ID:uLSanIIA0243nobodyさん
05/03/18 14:40:54ID:???$m_header =~/^Subject: *(.+\x0D?\x0A(?: .+\x0D?\x0A)*)/im;
普通はモジュール使うけど。
use Mail::Header;
my $head = Mail::Header->new(\*STDIN);
print $head->get('Subject');
0244241
05/03/18 18:00:07ID:R05cZtNs>>243
ありがとうございましたっ!!
242でも243でもできました。感謝です。
>>243
Mailで始まるモジュール、1つも入ってないのです・・・
・・・
0247nobodyさん
05/03/19 01:20:39ID:???そこまでしなきゃわかんないアマちゃんなのかよ!!!
$m_header = "Subject: =?ISO-2022-JP?B?GyRCJCIbKEI=?=\n =?ISO-2022-JP?B?GyRCJFsbKEI=?=\n";
$m_header = "Content-Type: text/plain\n Subject: foo\n bar\n";
0248nobodyさん
05/03/19 01:50:04ID:???0249nobodyさん
05/03/19 03:53:17ID:RErqV7fDすべての文字列の中から上の中の*********だけを取り出すことはできますか?
*は任意の文字列で、文字数も自由です。
0252nobodyさん
05/03/19 14:37:12ID:frwLr80o0253nobodyさん
05/03/19 16:05:41ID:???0254nobodyさん
05/03/19 18:00:42ID:???0255nobodyさん
05/03/19 18:15:41ID:???0256nobodyさん
05/03/19 19:58:20ID:???0257nobodyさん
05/03/19 22:11:06ID:???0258nobodyさん
2005/03/21(月) 12:03:14ID:???いろんな形の <br><br/><BR /> などなどを
<br /> に統一したい。どうしたらいいですか!?
<[Bb][Rr]*(\\)>
0259T女の竹田
2005/03/21(月) 12:19:14ID:???でどう?
<br clear="left">とかも入れるなら
s{<br[^>]*>}"<br />"sgi
かな。
0260T女の竹田
2005/03/21(月) 12:21:11ID:???s{<br( ?/)?>}'<br />'sgi
のほうがいいかな
0261nobodyさん
2005/03/21(月) 13:54:11ID:???↑ これは一体何をしたかったのだろう・・・。
んじゃ
s!<br(?>[^<>]*)>!<br />!igs;
ところで、 i g s m x e o とかのオプションって、書く順番とか決めてる?
どの順番がわかりやすいんだろうなー。
0263T女の竹田
2005/03/21(月) 14:39:41ID:???順番はsgieの順だな、他は使ったことがほとんどない
0264nobodyさん
2005/03/26(土) 01:18:00ID:vkj2cQCrhtmlのaタグに囲まれた文字、それとa閉じタグ以降の文字、を抽出したいのですが
例:<a href="http://hogehoge.com">aiueo</a>&nbsp;|
抽出後:aiueo&nbsp;|
のような感じです。
で、正規表現として「s/<a.*?>(.*?)</a>(.*?)/i」と書いたのですが、
aタグに囲まれたのは$1に入りましたが、a閉じタグ以降の文字が$2に入ってないんです。
どう書いたらよいのでしょうか?
0265nobodyさん
2005/03/26(土) 01:36:05ID:???それ、
s{<a.*?>(.*?)<}{a>(.*?)}i
になってるよ。sはいらない。
m!<a.*?>(.*?)</a>(.*?)!i
とでもしたら?
0266nobodyさん
2005/03/26(土) 09:11:49ID:???> で、正規表現として「s/<a.*?>(.*?)</a>(.*?)/i」と書いたのですが、
/をエスケープして「s/<a.*?>(.*?)<\/a>(.*?)//i」と書いてください。
0268nobodyさん
2005/03/26(土) 16:07:09ID:???0269nobodyさん
2005/03/26(土) 16:14:16ID:???0271268
2005/03/26(土) 16:16:30ID:???掲示板にAAの大量投稿荒らしが発生してしまって、
正規表現である程度は弾けないか、、と思いまして・・・
0272未承諾広告※ ◆TWARamEjuA
2005/03/26(土) 19:04:15ID:???このあたりはRock54でも難しかったりしますけれども(苦笑)
0273nobodyさん
2005/03/26(土) 19:18:46ID:???0275nobodyさん
2005/03/26(土) 20:19:03ID:???■ このスレッドは過去ログ倉庫に格納されています