正規表現道場@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/
0377370
2005/05/17(火) 15:25:00ID:???$test = 'あん'; //機種依存のsjis文字入り(同じ文字はありません)
$test =~ s/\G((?:[\x80-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF8\xF9][\x40-\x7E\x80-\xFC
])/$1/eog;
これはPerlスクリプトなんですが、これをPHPに移行したいと思います。
eogを除いてpreg_replaceすると>>370のように何故か5c30になってしまいます。
$test1 = mb_ereg_replace("([\xF8\xF9][\x40-\x7E\x80-\xFC])","\\1" , $test);
これはWarning mbregex compile err: mismatch multibyte code length in char-class range in となってしまいます
どこがおかしいのですか??
0378nobodyさん
2005/05/17(火) 15:44:02ID:???多分、ダブルクオートの中でバックスラッシュを使っているので、
正規表現エンジンに渡る前にバックスラッシュが展開されているのではないかと。
"\\xF8" みたいにするか '\xF8' みたいにシングルクオートにすると良いかと。
0379nobodyさん
2005/05/17(火) 19:27:46ID:???ありがとうございます
シングルクオートに変更したところ、そのエラーは出なくなりましたが、次は
mbregex compile err: too short multibyte code string in
と出るようになってしまいました
何が短いのですか?
0380nobodyさん
2005/05/18(水) 10:51:05ID:???正規表現スレなのでスレ違いなのですが自分なら
<?php
$emoji = pack("n*", 0xF89F, 0xF8A0, 0xF8A1);
$test = "絵文字test1".$emoji."test2";
$count = mb_strlen($test, "sjis");
for ($i = 0; $i < $count; $i++) {
$char = mb_substr($test, $i, 1, "sjis");
$char_hex[1] = 0;
if (strlen($char) == 2) $char_hex = unpack("n", $char);
if ($char_hex[1] > 0xF89E and $char_hex[1] < 0xF9FD) echo " <b>".bin2hex($char)."</b> ";
else echo $char;
}
?>
こうする。
0381nobodyさん
2005/05/18(水) 13:05:20ID:JNoGnyuI0382nobodyさん
2005/05/18(水) 17:17:50ID:???> http://www.din.or.jp/~ohzaki/perl.htm
> > HTMLタグの正規表現
> > $comment_tag_regex =
> > '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
ってあるんだけど、これ通すと
my $str = '<!--- abcde --->'; とか
my $str = '<!-- \n var i=0; i--; document.write(i); \n // -->'; とか
全然うまくとれないんだけど、どう改造すればいい?
(?:[^>-]*(?:-[^>-]+)*?)??
↓
(?:[^>-]*(?:-[^>-]*)*)??
こうすると ↑↑ のはとってくれるけど、今度は
my $str = '<!-- comment -- cdata --> comment -->';
これが最後までとってくれなくなって困る orz
0383382
2005/05/18(水) 17:30:24ID:???× my $str = '<!-- comment -- cdata --> comment -->';
○ my $str = '<!-- comment -- cdata -- > quote_comment -->';
こんなで。
0384382
2005/05/18(水) 17:57:38ID:???それだったら /<!--.*?-->/ で事足りるのかw
スレ汚しスマヌ
0385nobodyさん
2005/06/02(木) 19:31:18ID:???Perlで試したところ
(?=.*AAA)(?!.*BBB)
でいける感じなのですが、
開発に使用しているのはUNIXのC言語です。
(?=や(?! を使わないで、これと同じことを記述できませんでしょうか。
0386nobodyさん
2005/06/02(木) 20:12:51ID:???0387nobodyさん
2005/06/02(木) 20:38:20ID:???「UNIXのC言語」といってもいろんな正規表現ライブラリがあるわけですが・・・
# ちょうどプログラム板の正規表現スレでそんな話題が。
POSIX regex (re_format(7)) だと簡単には書けそうにないので
>>386 みたく二回正規表現マッチさせるか、
(?= や (?! をサポートした正規表現ライブラリを使うのが良いのでは?
0388nobodyさん
2005/06/03(金) 17:12:04ID:kgnGijhBK2Editorというエディターを使用して、ある文章の中にある
「$英数字」という部分を検索したいのですが、
どのように正規表現を記述していいのか分かりません。
$英数字の前後には半角スペースが入っており、それに続いてまた記述があるので、
半角スペース前後まで検索したいと思っています。
例えば、
test $kensaku test
という個所があるとすると、$kensakuのみ検索対象にしたいのです。
K2Editorのヘルプを見る限り、$を使用するためのエスケープが\eと書いていました。
とすると、\e$[a-zA-Z_]+
と思ったのですがうまくいきませんでした。
ご教授下さい。
0391nobodyさん
2005/06/03(金) 18:59:45ID:???0394nobodyさん
2005/06/05(日) 13:57:15ID:OswuRoJX・使えるのは半角英数字アンダーバーのみ
・最初の文字は英字のみ
宜しくお願いします
0395nobodyさん
2005/06/05(日) 17:29:54ID:???ってのはだめ?
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]*)*)*$
でヒットすることがわかりました。
この先がどうしてもわからないのです。
お知恵をお貸し下さい。
■ このスレッドは過去ログ倉庫に格納されています