正規表現道場@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/
0396nobodyさん
NGNG文字数制限はない? 1文字以上ならOKの例で書いた
0397nobodyさん
2005/06/07(火) 20:45:12ID:???>>396
両方無理でした
普通にアンダーバー最初に書いても通っちゃいました
もしかして
if($FORM{'id'} =~ /^[a-zA-Z]\w+/);
じゃなくて
unless($FORM{'id'} =~ /^[a-zA-Z]\w+/);
みたいにしないとダメ?
0399nobodyさん
2005/06/09(木) 19:55:53ID:???0400nobodyさん
2005/06/09(木) 20:52:22ID:???0401nobodyさん
2005/06/09(木) 20:53:51ID:???0402nobodyさん
2005/06/09(木) 21:31:28ID:???すいません、もうしません…
0403nobodyさん
2005/06/10(金) 09:18:36ID:???0404nobodyさん
2005/06/10(金) 21:49:19ID:???0405nobodyさん
2005/06/11(土) 18:52:57ID:yQRzdV10スクリプトを使っていますが
$url =~ m!(http:)?(//)?([^:/]*)?(:([0-9]+)?)?(/.*)?!;
if ($3) {$host = $3;}
if ($5) {$port = $5;}
if ($6) {$path = $6;}
$path =~ s/#(.)*$//;
http://User:Password@…というBasic認証のURLでユーザー名とパスワードを
抽出するためにはどう改造したらよいですか?
0407405
2005/06/11(土) 21:12:07ID:yQRzdV10昔、どこかのサイトに掲載されてたのをコピペで使ってます。
改造でなく、書き直しして頂いても、ありがたいです。
0408nobodyさん
2005/06/11(土) 21:20:56ID:???0409nobodyさん
2005/06/12(日) 06:55:46ID:???0410nobodyさん
2005/06/13(月) 09:18:09ID:???0412nobodyさん
2005/06/18(土) 01:50:56ID:ioO/WA9Kperlで書かれたソースをphpに移行しようと試みています。
以下のperlのソースをphpで書くとどのようになりますでしょうか。
$data =~ s/"/"/g;
一応、
preg_replace("s/"/"/g", $data);
かなと思ったのですが、マニュアルを読んでみると、
phpの正規表現には修飾子「g」は無い、とあります。
他の関数を使う、関数をいくつか組み合わせるなど、
違う表現の仕方が必要になってくるのでしょうか。
お力添え宜しくお願いします。
0413nobodyさん
2005/06/18(土) 04:07:16ID:???preg_replaceはグローバルマッチだお!
preg_replace('/"/','"e;',$data);
0414nobodyさん
2005/06/18(土) 04:11:00ID:???$data = preg_replace('/"/','"',$data);
0415nobodyさん
2005/06/18(土) 08:51:00ID:7Fs175F40416nobodyさん
2005/06/18(土) 08:57:03ID:ioO/WA9K<$data = preg_replace('/"/','"',$data);
ご返答ありがとうございます。
グローバルマッチでしたか、申し訳ありません、勉強不足でした。
マニュアルを確認してみたところ、確かにそのような記述がありますね。
「limitが 省略されるか -1 の場合、マッチするものは全て置換されます。
」
>mixed preg_replace ( mixed pattern, mixed replacement,
>mixed subject [, int limit])
>subjectに関して patternを用いて検索を行い、 replacementに置換します。
>limitを指定した場合、limit 回のマッチまで置換が行なわれます。
>limitが 省略されるか -1 の場合、マッチするものは全て置換されます。
ありがとうございました!
0418nobodyさん
2005/06/20(月) 17:29:30ID:???6・19人権擁護法案に反対する国民集会の音声ファイル(各20-40MB)
http://www.powup.jp/jinken/20050619/1_hiranuma_furukawa.mp3
http://www.powup.jp/jinken/20050619/2_hirata.mp3
http://www.powup.jp/jinken/20050619/3_otsukotsu.mp3
http://www.powup.jp/jinken/20050619/4_chihougiinn.mp3
3番目は特におもしろい
0419nobodyさん
2005/06/22(水) 15:46:50ID:e2RB9R1Aエラーを表示させるために[:punct:]を使ったところ
「与」などの一部の文字が想定外のマッチをしてしまうのですが
どうやって回避すれば良いのでしょうか…
こんな感じで書いています。
if (preg_match("/[[:punct:]]/", $_GET['word'])) {
echo "記号が含まれています。";
exit;
}
0422419
2005/06/22(水) 16:32:12ID:e2RB9R1A既に運用を始めてしまっているので、文字コードを変えるのは厳しいですね…
>>421
間借りレンタルサーバーなのでmbregexのインストールは無理っぽいです…
回答ありがとうございます。
もう少し模索してみます。
0423nobodyさん
2005/06/22(水) 17:06:39ID:???そっか。じゃあこんなんでどうだろ?
$sjis = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]|[\xA1-\xDF])';
if (preg_match("/^${sjis}*[[:punct:]]/", $str)) { ... }
0427nobodyさん
2005/06/22(水) 19:47:10ID:???インスコできないという話では?
>>425
Shift_JIS の「与」には "^" が混じっているのでそれがそもそもの問題。
Shift_JIS の文字の一部として "^" が出現した場合には [:punct:] にマッチさせず、
単独に出現した場合のみ [:punct:] にマッチするようにすると良い。
$sjis は ASCII 以外の Shift_JIS にマッチする正規表現で、
先に「与」を $sjis に食べさせて (マッチさせて) おけば、
単独に出現した "^" は [:punct:] に正しくマッチする。
・・・俺、説明下手だな orz
0428nobodyさん
2005/06/22(水) 21:21:48ID:???0430nobodyさん
2005/06/24(金) 15:01:19ID:???「あいうえおabcde^!?」 とか
0431nobodyさん
2005/06/24(金) 15:08:37ID:???設問が「文字列に半角記号が含まれている場合、エラーを表示させるために」
だったので敢えて入れなかったんですが、
そういう動作を意図しているんなら入れるべきでしょうね。
0432nobodyさん
2005/06/24(金) 19:13:15ID:???0433nobodyさん
2005/06/25(土) 18:30:15ID:???こういうカッコがネストされた文字列があるとき、
対応したカッコ (abc 〜 s) までを取り出したいんだけど、何かいい方法はある?
ちなみに、Perl で カッコのネストの深さは 任意 、ってことで。
対応したカッコにあらかじめ番号振っておくくらいしか思い浮かばない・・・orz
0434nobodyさん
2005/06/25(土) 19:22:29ID:???http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
0435nobodyさん
2005/06/25(土) 19:48:07ID:???レスありがとう
でも、それ、 2重までなのか、結果が、
(def)
(mno (p) q )
(uv(wxy)z)
って出ちゃうんだよね・・・。 orz
0437nobodyさん
2005/06/25(土) 20:05:08ID:???ああ、そうか、
$openclose = qr/\([^()]*(?:(??{$openclose})[^()]*)*\)/;
の $openclose をグローバルにしたらうまくいったよ!
ってグローバルじゃなきゃだめなのか・・・。
$_ でやったら perl 死ぬなあ。 ふむ。
とりあえずありがトンー。
0438nobodyさん
2005/06/25(土) 22:28:47ID:???#!/usr/local/bin/perl -w
use strict;
my $str = '(abc (def) ghi ( jkl (mno (p) q ) r) s) t (uv(wxy)z)';
my $openclose;
$openclose = qr/\([^()]*(?:(??{$openclose})[^()]*)*\)/;
while ($str =~ /($openclose)/g) {
print $1, "\n";
}
__END__
0439nobodyさん
2005/06/25(土) 23:17:06ID:???0440nobodyさん
2005/06/26(日) 01:22:38ID:XF0TC+BI([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))
で合ってますか??
0442nobodyさん
2005/06/26(日) 02:08:19ID:XF0TC+BI>>441
こういうことですか?
よくわからないです、、
0443nobodyさん
2005/06/26(日) 02:13:05ID:???0444440
2005/06/26(日) 02:58:14ID:???とりあえず、初歩の初歩だけは読んで理解したつもりなんですが、、
これでは全部抜けませんか?
0445nobodyさん
2005/06/26(日) 03:55:40ID:???grep と言っても色々あるわけでな…。
http://www.kt.rim.or.jp/~kbk/regex/regex.html
ERE なら
grep -E '((1[0-9]?[0-9]?|2(5[0-5]?|[0-4]?[0-9]?)|[3-9][0-9]?|0)\.){3}(1[0-9]?[0-9]?|2(5[0-5]?|[0-4]?[0-9]?)|[3-9][0-9]?|0)' ip_address.list
但しこれは "516.171.8.192" という文字列があった場合、"16.171.8.192"
にマッチする。GNU grep なら \b が使えるので、前後に \b をつければ
これを回避できる。
0446nobodyさん
2005/06/26(日) 05:36:06ID:???\n\n\s\s\s\s\n\n\n\n\n\n\nという行があるとして、
検索した時に両方ともマッチする表現ってないかな?
0447nobodyさん
2005/06/26(日) 06:00:33ID:???0448446
2005/06/26(日) 06:22:39ID:???<td rowspan=3 align=center>\n\n\s\s\s\s\n\n\n\n\n\n\n\n\n<a href=(.+?)>
と
<td rowspan=3 align=center>\n\n\s\s\s\s\n\n\n\n\n\n\n<a href=(.+?)>
なんだがPHPでRSSを出力してる最中に同じページで条件が違って参ってるんだ。
0450nobodyさん
2005/06/26(日) 09:54:32ID:???0451nobodyさん
2005/06/26(日) 11:06:09ID:???0452nobodyさん
2005/06/26(日) 16:40:57ID:???htmlタグ内のurlにもマッチしてしまうので、困ってます。
環境は PHP 4.3系 です。
コードは
$str = preg_replace('/(?:href=["\']){0}((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '<a href="\1">\1</a>', $str);
や
$str = preg_replace('/(?:^href=["\'])((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '<a href="\1">\1</a>', $str);
$str = preg_replace('/([^"]|^)((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '\1<a href="\2">\2</a>', $str);
$str = preg_replace('/([^=^"]|^)((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '\1<a href="\2">\2</a>', $str);
と、色々試して見てますが、
やはりどれもタグ内のURLにもマッチしてしまいます。
良く使われるパターンだろうけども、検索結果や他の人のコードを見ても上記のようなコードしか得られません。
どなたか分かる方いますか?
0453nobodyさん
2005/06/26(日) 17:14:29ID:Mzx+46/z0454nobodyさん
2005/06/26(日) 18:55:27ID:Di+cudPS┃┌╋──╋┐┃
└╋┘ └╋┘
┃ ・ ・ ┃ ┌━━┐
●━╋┐ ┌╂━━━━╂┐ ┃
└━┷┴━━╂┘ └╋━
0455nobodyさん
2005/06/26(日) 19:03:15ID:???0456nobodyさん
2005/06/26(日) 19:41:04ID:???タグのついてないタイミングがあればそこでオートリンクすればいい。
もしくは誤認識をしない区間を一度切り出すとか。
<a href="http略"><b>http略</b></a>
452が考えてる方法だと↑こっちに反応してしまうよ。
0457nobodyさん
2005/06/27(月) 02:30:35ID:???http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside
Perl の例だが、やり方が理解できれば PHP でも書けるだろう。
0458nobodyさん
2005/06/28(火) 18:33:30ID:7mbB9ytscygwinのperl5.8です。
fuga
hogehoge
のような複数行にわたる文字列にマッチさせたいのですが
if (m!
fuga\r\n
hogehoge\r\n
!mx)
ではマッチしません。どう記述すればよいのでしょうか?
0459nobodyさん
2005/06/28(火) 18:46:58ID:???まずその文字列の改行コードがスクリプト上で実際にどんなバイト列と
なっているか調べた方がいいかもな。Cygwin は Default Text File Type の
設定も絡んでくるから、素直に ActivePerl 使った方が悩まずに済む。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html#using_character_classes
0460nobodyさん
2005/06/28(火) 19:48:30ID:7mbB9yts単一行の hogehoge\n にはマッチせず、 hogehoge\r\n にマッチしますので
改行コードに問題はなさそうです。
正規表現の問題ではなく環境依存の問題ということでしょうか。
もう少し調べてみます。
0461nobodyさん
2005/06/28(火) 20:06:42ID:???0462nobodyさん
2005/06/28(火) 20:16:47ID:nrjgh71k0463458
2005/06/28(火) 20:30:28ID:7mbB9ytsm/hogehoge\s+/s
これにはマッチするのですが、
m/fuga\s+hogehoge\s+/s
これにはマッチしません。。。
0464nobodyさん
2005/06/28(火) 20:33:41ID:???基本的な質問で恐縮なのだが、
$_ には確かに "fuga\r\nhogehoge\r\n" という文字列は入っている?
0465458
2005/06/28(火) 20:52:33ID:7mbB9ytswhile ( <> ){
if(m/fuga\s+hogehoge\s+/s){print "OK\n";}
}
こんなので標準入力から読み込ませているのですが、それを確認する方法がわかりません。
複数行読まれていないとしたら、どうしたらよいのでしょうか。
もうスレ違いな領域に入っているようですが。。。
0466nobodyさん
NGNG0467458
2005/06/28(火) 21:05:12ID:???undef $/;
でうまくいきました。
お蔭様で、昨日から悩んでいたのが解決できました。
本当にありがとうございます。お騒がせして申し訳ありません。
0468nobodyさん
2005/06/28(火) 22:46:19ID:???0469nobodyさん
2005/06/29(水) 16:25:17ID:???0470nobodyさん
2005/06/30(木) 22:01:58ID:uEEJE9h23文字以内の行(を改行のみに置換)
ってどう書いたらいいでしょうか?
0471nobodyさん
2005/06/30(木) 22:15:26ID:FhJSSQPy文字と言っても色々ありますが・・・
0472nobodyさん
2005/06/30(木) 22:44:30ID:???s/^.{0,3}$//;
0473nobodyさん
2005/07/01(金) 01:34:23ID:2L+Akkii取得するにはどうすればよいでしょうか?
-----
<table>
<tr><th>番号</th><th>氏名</th></tr>
<tr><td>01</a></td><td>山田太郎</td></tr>
<tr><td>02</a></td><td>山田次郎</td></tr>
</table>
0474nobodyさん
2005/07/01(金) 02:21:26ID:???$_ =~ m!^<tr><td>([^<]*)</a></td><td>([^<]*)</td></tr>!;
0475nobodyさん
2005/07/01(金) 02:59:52ID:???0476nobodyさん
2005/07/01(金) 12:53:26ID:???0477nobodyさん
2005/07/02(土) 09:11:37ID:???いまのところ、文字列fooを含まない行は
^(((([^f]*)*(f+[^o][^f]*)*)*)*(f+o[^o][^f]*)*)*$
でヒットすることがわかりました。
この先がどうしてもわからないのです。
お知恵をお貸し下さい。
0478nobodyさん
2005/07/02(土) 12:29:04ID:BTmtp6GJ0479nobodyさん
2005/07/02(土) 16:29:59ID:???言語は?
http://www.din.or.jp/~ohzaki/regex.htm#And
print "$_ => ", /^(?=.*foo)(?:(?!bar).)*\z/ ? 'o' : 'x', "\n" for qw(
abarcdefoog abcdefooghi abarcdefghi abcdefghijk
gfooedcbara ihgfooedcba ihgfedcbara
);
0481nobodyさん
2005/07/02(土) 17:17:32ID:???ありがとうございました。
試してみましたが、うまくいかないようです。
ちなみにperlではありません。
ここにあるコンポーネントを使っています。
http://homepage1.nifty.com/bmonkey/delphi/delphi.html#REXP
0482nobodyさん
2005/07/02(土) 17:29:23ID:???0483nobodyさん
2005/07/02(土) 17:49:47ID:???「ほげほげを含む文字列にマッチ」させて否定をとりゃいいじゃんと
思うのだが、そうしないのは何か理由があるのだろうか。
0484nobodyさん
2005/07/02(土) 17:54:12ID:???ここ "Web"Prog だしなあ。
0487nobodyさん
2005/07/02(土) 19:47:06ID:???0490nobodyさん
2005/07/03(日) 04:10:52ID:???0491nobodyさん
2005/07/03(日) 14:30:29ID:???「否定が取れないソフト」の場合は確かに仕方ないけど、
そうでないケースもこのスレの質問では結構多いと思う。
それに、 >>484 の言うとおり、 "Web"Prog でそんなソフトはあまり無いと思われ。
0492nobodyさん
2005/07/04(月) 11:06:12ID:???マッチしない文字列にのみマッチする正規表現は
一般には作れますか? 有限オートマトンだから
作れそうな気はするのですが。
0493nobodyさん
2005/07/04(月) 16:44:56ID:LXfnoi1Z変数$html にとあるHTMLファイルを読み込みまして、そのHTMLに記述されている
<!-- コメント1 --> から <!-- /コメント2 --> までの範囲にある文字列(タグ含む)を
変数$hensu に代入したいのです。
preg_match を使えとのことだったんですが、具体的にどうやればよいのか分かりません。
どうかご教授頂けますでしょうか。お願い致します。
0494nobodyさん
2005/07/04(月) 16:49:45ID:???あのね、
http://pc8.2ch.net/test/read.cgi/php/1117945031/769
に答え出てますよ。
■ このスレッドは過去ログ倉庫に格納されています