正規表現道場@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/
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
に答え出てますよ。
0496nobodyさん
2005/07/06(水) 21:23:47ID:uSLwEBZ9見たいな数値と.の組み合わせの文字列を
123.45789のように
最初に出現する.を除き除去するにはどうすればよいでしょうか?
0497496
2005/07/06(水) 21:26:13ID:uSLwEBZ9javascriptで行うつもりです。
0498nobodyさん
2005/07/06(水) 22:06:55ID:???var a='123..45.78.9'.replace(/\./,'<<escape>>').replace(/\./g,'').replace(/<<escape>>/,'.');
0499nobodyさん
2005/07/08(金) 22:48:37ID:???13756〜36865みたいな中途半端な数字の範囲は
どう表現すればよいのでしょうか?
0501499
2005/07/09(土) 00:10:04ID:???正規表現でできると講師に聞いたのでやってみようといろいろ試したのですが全くわからなくて
ここで聞いてみたのですが・・
正規表現以外でできるものがあるのですか?
0502JAPU
2005/07/09(土) 02:15:39ID:???上記の条件を受理する正規表現は存在するので,理論上は可能。
たとえば,123 - 456 の整数なら (JS知らないのでPerlの表現になるけど)
^(?:12[3-9]|1[4-9]\d|[23]\d\d|4[0-4]\d|45[0-6])$
または
^(?:123|124|125| 途中略 |454|455|456)$
となる。13756 - 36865 でも同様に書ける。
でも,数字に変換して,その範囲かどうかチェックしたほうが速くない?
0503nobodyさん
2005/07/09(土) 08:57:03ID:b0QlFvY60504nobodyさん
2005/07/09(土) 18:16:14ID:XiYWtJZE0505JAPU
2005/07/09(土) 19:55:25ID:???(日本語版「詳説正規表現」)
0506nobodyさん
2005/07/09(土) 22:43:09ID:???0507nobodyさん
2005/07/11(月) 09:54:07ID:???最近、昔懐かしいコテをいろいろ名乗っている人がいるので
このJAPUたんも多分偽者ジャマイカ?
ほかにはT女の竹田とかも見た。
0508nobodyさん
2005/07/12(火) 01:28:34ID:???0509nobodyさん
2005/07/12(火) 06:21:34ID:???0510JAPU
2005/07/12(火) 21:37:17ID:???http://www.japu.org/tmp/2ch.txt
0511nobodyさん
2005/07/13(水) 06:58:27ID:???0513506
2005/07/14(木) 01:35:07ID:???チャンコダイニング若で鍋でも囲もうじゃないか。
0514nobodyさん
2005/07/17(日) 16:02:42ID:6p9wxgWqこの正規表現を理解したいです。
\$([E-G])
\x0f/e
この2点の意味がわかりません。
/はどのような意味を持つのでしょう?
よろしくお願いします。
0515514
2005/07/17(日) 23:47:07ID:???0516nobodyさん
2005/07/17(日) 23:49:01ID:???まあそーゆーな
16進で1b,$そのもの,EからGのどれか,16進21から7aのどれかの中から一文字以上繰り返し,16進0f
で/は閉じ
eはフラグだから正規表現とは関係なし
0517516
2005/07/17(日) 23:53:33ID:???その場合は/は/そのもの
最後のところは16進0f, /, eというシーケンス
ていうか何の言語での話か
わからないとわからないよ
0518nobodyさん
2005/07/18(月) 00:25:05ID:???0519514
2005/07/18(月) 00:57:29ID:???/−/e
は正規表現の置換ですね。
$ = 0x24
E-G = 0x45-0x47
のことだとわかって納得しました。
本に書いてあるコードなんですが、直前まで16進数で解説してたのでわかりませんでした。
ありがとうございました。
0520nobodyさん
2005/07/18(月) 01:04:26ID:jRcBcWiXよかったら書名教えて
あと「正規表現の置換」て意味わからないから
■ このスレッドは過去ログ倉庫に格納されています