正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/11/19 21:42ID:Kst3Nn4Sこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
註:& や " を書くときには、& " と描いておきましょうね。
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/
0499nobodyさん
04/07/17 14:48ID:TroGWL8bありがとうございます!
本当に助かりました。^^
0500nobodyさん
04/07/17 15:11ID:TroGWL8b配列にする場合、split関数の引数はどのように書けばよいでしょうか?
$b = " 02600 0 1111"
現在、$a=split(" *",$b);でやっておりますが、うまく出来ません。
よろしくお願い致します。
0501nobodyさん
04/07/17 15:15ID:TroGWL8b訂正です。
$a=split(" +",$b);でやっておりますが、うまく出来ません。
補足です。
上記の例の場合、配列$aに以下のように入れたいと思っています。
$a[0]=02600
$a[1]=0
$a[0]=1111
よろしくお願い致します。
0502nobodyさん
04/07/17 15:16ID:TroGWL8bすいません。また訂正です。
$a[0]=1111
↓↓↓↓↓
$a[2]=1111
0503nobodyさん
04/07/17 15:30ID:TroGWL8b出来ました。
スペースの全角と半角の区別をしてなかったのが原因でした。
失礼しました。
0504nobodyさん
04/07/18 10:56ID:???これでダブルクオートに囲まれた文字列に一致すると思うんですが、
ダブルクオートの中にエスケープされたダブルクオートがあると、そこまでで一致終了してしまいます。
当然ですが。
エスケープされた物を無視させるにはどうすればいいですか
0505nobodyさん
04/07/18 11:12ID:???0506nobodyさん
04/07/18 11:45ID:???"foo\"bar" と \ でエスケープするなら
/(?<!\\)"((?:\\"|[^"])*)"/ で $1 に foo\"bar が入る。
…少なくとも Perl 5.005 以降なら。
0508nobodyさん
04/07/18 21:19ID:???でもこれだと
"test\""
これに対応しない・・・
test
になっちゃった・・・・・
0509nobodyさん
04/07/18 22:03ID:???0510nobodyさん
04/07/18 22:14ID:???使用言語とテストコードを書いてくれんと何が悪いか分からんよ。
#!/usr/local/bin/perl
require 5.005;
$_ = '"test\""Test:"\100-", tes"T""t\"e\"S\"t"';
print "$1\n" while /(?<!\\)"((?:\\"|[^"])*)"/g;
print "$1\n" while /(?<!\\)"([^"]*(?:(?<=\\)"[^"]*)*)"/g; # ループ展開版
__END__
0511nobodyさん
04/07/18 22:32ID:???とりあえず、HTMlタグ内とタグ外、コメントとそれ以外に分けて配列化してるんです
言うならば・・・普通のテキストを
#CDATA, tag, tag, tag, comment, #CDATA, comment, tag, comment, tag.......
みたいな感じで。分かりづらかったらすみません
0512nobodyさん
04/07/18 22:33ID:K8gWFvF7undef @tg;
undef @ot;
push @tg, $1 while($str =~ s/(<!--.*?-->)//s);
@ot = split /<!--.*?-->/s, $tmp;
$i = 0;
foreach (@ot){
push str, $_;
push str, $tg[$i++];
}
foreach (@str){
$tmp = $_;
undef @tg;
undef @ot;
undef @strtg;
push @tg, $1 while(s/(<(?:(?:\\"|[^"])*(?<!\\)"(?:\\"|[^"])*")*?>)//s);
@ot = split /(?:<(?:(?:\\"|[^"])*(?<!\\)"(?:\\"|[^"])*")*?>)/s, $tmp;
$i = 0;
foreach $r (@ot){
push ret, $r, $tg[$i++];
}
}
foreach (@ret){
print $i++, $_ if($_ && $_ !~ /\A\s\Z/s);
}
0513nobodyさん
04/07/18 22:33ID:???読みづらくてすみません
0514nobodyさん
04/07/18 23:15ID:???眠いので落ちます・・・・
0515nobodyさん
04/07/18 23:25ID:???サンプル
ttp://koumuinsiken.hp.infoseek.co.jp/
初心者ながら頑張ったのは…
<!-- isweb auto-insert \*/ -->\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n
すんません_no
0516nobodyさん
04/07/18 23:39ID:???/<!-- isweb auto-insert \*\/ -->.*?<!-- inserted by isweb server\/\* -->/s
こんなんじゃないのか?
0517nobodyさん
04/07/18 23:52ID:???文法はこれに準拠してるみたいですが、上手くいきません…。
0518nobodyさん
04/07/18 23:55ID:???HTML の属性値では " を \ でエスケープしたりせんが。
http://search.cpan.org/dist/HTML-Parser/
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
これ以上はスレ違いになりそうだから余所でやってくれ。
0520nobodyさん
04/07/19 00:02ID:???http://pc5.2ch.net/test/read.cgi/tech/1062152374/478-480n
が関係あるに 300 ペリカ。
0521nobodyさん
04/07/19 00:17ID:???Emeditorとかでマッチのテストしてみたんですが、
/<!-- isweb auto-insert \*\/ -->.*?<!-- inserted by isweb server\/\* -->/s
ではうんともすんとも言いませんでした。
なんか基本的な知識が欠けているような気がします。すんません。_no
0523nobodyさん
04/07/19 00:47ID:???http://www.emeditor.com/jp/help/dlg/find/
http://www.emeditor.com/jp/help/howto/search/search_regexp_syntax.htm
http://pc5.2ch.net/test/read.cgi/software/1087716064/
<!--\s+isweb\s+auto-insert\s+\*/\s+-->(.|\s)+?<!--\s+inserted\s+by\s+isweb\s+server/\*\s+-->
0524nobodyさん
04/07/19 07:43ID:???Emeditorに複数行にマッチする設定が無いのですが…
Pro版のは"."が改行にもマッチするように設定できるみたいですがこれですかね。_no
あといろいろ試してみたのですが、スペースは\sでも でもマッチするみたいです。
<!-- isweb auto-insert \*/ -->
>>523さんのもうんともすんとも言いませんでした。
おそらく複数行にマッチするようにチェック入れないといけないんでしょうけど。
マターリがんがります…。
0525nobodyさん
04/07/19 10:24ID:???>>523
コメントタグ中の/のエスケープが抜けている
0526nobodyさん
04/07/19 11:59ID:???EmEditor v4 Standard をインストールして確認したところ、\s が
改行にマッチしないし \n を含むパターンを量指定できないな。
一般的な正規表現エンジンと挙動が違うから、ここで質問しても
君の望む答は得られんだろう。この糞ソフトを使い続ける気なら
後は >>523 の専用スレに行ってくれ。
真っ当な正規表現エンジンを積んでいるソフトなら >>516 で OK 。
>>525
検索ダイアログに突っ込むのに / は関係無し。
0527nobodyさん
04/07/19 12:29ID:???宣伝してるのはお前か?
http://pc5.2ch.net/test/read.cgi/hp/1089046899/39
http://pc5.2ch.net/test/read.cgi/hp/1065089862/324
0528nobodyさん
04/07/19 12:43ID:???・PeggyPad
うんともすんとも
・PHPエディタ
普通の文字、または左括弧"("が必要です.
と出ました。しょぼーん。
秀まるお使ったほうがいいですかね?
>>527
http://www.google.co.jp/search?num=50&lr=lang_ja&ie=Shift_JIS&oe=Shift_JIS&q=infoseek
で一番上に来るサイトを選んだだけです。とりあえず否定しときますです。
0529nobodyさん
04/07/19 13:26ID:???ローカルのperlを利用するマクロならできたけど。
で、マッチしたとして何をしようってのよ?
保存したソースから削除とかなら複数行置換えできるフリーソフトのほうが簡単だぞ。
0530nobodyさん
04/07/19 21:20ID:???あっちのスレにも誤解されそうな人がいますが…
0531nobodyさん
04/07/19 23:57ID:???秀丸がダメなのはヘルプに説明があるよ。
(「検索系コマンド」の「\nを使った複数行検索の際の制限について」)
>>530
エディタのマクロかなんかでプロキシ作るのかい?
0532nobodyさん
04/07/22 12:26ID:???0533nobodyさん
04/07/22 14:35ID:???広告を非表示にしたいわけか
0534nobodyさん
04/07/24 14:34ID:wErUOaoh$str = "googleの結果<br>ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&q=ereg_replace&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja<br>..."
$str = ereg_replace("http://[^<>[:space:]]+[[:alnum:]/]","<a href=\\0>\\0</a>", $str);
これをこのように出力したい。
<a href=ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&q=ereg_replace&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja>ttp://www.google.co.jp/search?hl=ja&ie=...</a>
0535nobodyさん
04/07/24 14:51ID:???$strからgoogleの結果<br>と<br>を取り除いてから
<a href=$str>ttp://www.google.co.jp/search?hl=ja&ie=...</a> でいいだろ。
0536nobodyさん
04/07/24 15:12ID:wErUOaoh$str はいわゆる掲示板の書き込みのコメント部分です。
で、それを自動リンクしたいんですが、コメント中に長いURLを張るとテーブルが壊れます。
実際のリンクは超略しないで、表示部分だけ短く省略したいんです。
0537nobodyさん
04/07/24 16:35ID:???0538nobodyさん
04/07/24 17:11ID:wErUOaohヘボイらしいのですが、ここを参考にして何とかなりました。
お騒がせしました。
0539nobodyさん
04/07/24 23:27ID:b6ZQFx0g<table> <tr> <th> TH1 </th> <td> TD1 </td> </tr> </table>
<table> <tr> <th>
<table> <tr> <th> TH2 </th> <td> TD2 </td> </tr> </table>
TH3 </th> <td> TD3 </td> </tr> </table>
欲しいものは、
TH1 と TD1
TH2 と TD2
<table> <tr> <th> TH2 </th> <td> TD2 </td> </tr> </table> TH3 と TD3
です
環境は php4.3 です
0540nobodyさん
04/07/25 01:22ID:???0541nobodyさん
04/07/25 04:31ID:???0542nobodyさん
04/07/25 06:16ID:???http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
0543nobodyさん
04/07/26 14:57ID:nr00S6gf#の前の文字列を取得したい場合はどのような正規表現にすれば良いのでしょうか○| ̄|_
0546nobodyさん
04/07/28 01:04ID:???------------------------
<qqq>
<abc>123</abc>
<rrr>aiueo</rrr>
<abc>456</abc>
</qqq>
------------------------
というような構造のとき、
<qqq>の中の文字列を取り出し
それに対して
/<abc>([^&]+)<\/abc>/
でマッチング処理を行うと、
------------------------
123</abc>
<rrr>aiueo</rrr>
<abc>456
------------------------
という結果になってしまいます。
一つ目の<abc>123</abc>に正しく反応させたいのですが
どのようにすればよいのでしょうか。
よろしくお願いいたします。
※マッチング処理の際の
/<abc>([^&]+)<\/abc>/
のabc部分は可変です。
0548nobodyさん
04/07/28 01:37ID:???546です。すみません、本当に助かりました。
ありがとうございます。
(とほほさんのHP見ながらやっていたんですが、それ以外にも対応していたり
するんですね。今後は気をつけます。)
0549nobodyさん
04/07/28 01:37ID:???0550nobodyさん
04/07/28 02:00ID:???0552nobodyさん
04/07/29 00:49ID:???546ではないけど質問です。
/<abc>([^&]+?)<\/abc>/
だと<abc>123</abc>にはマッチするけど、<abc><123></abc>マッチしませんでした。
こういう文字コードを使われてるものもマッチさせる方法はあるんですか?
0553nobodyさん
04/07/29 09:01ID:???0554552
04/07/29 10:14ID:???<abc>&lt;123&gt;</abc>
↑は/<abc>([^&]+?)<\/abc>/でマッチしないのですが、
マッチさせる方法はあるのですか?
0556nobodyさん
04/08/01 14:12ID:???$aには、変動する数字が代入されているとします。
【$aが、2000で割り切れる値であるとき、真を返す】
もしくは、
【下4桁が、2000・4000・6000・8000・0000のいずれかであるならば、真を返す】
としたい場合には、どのようなソースになりますか?
ご教授お願いいたします。
0557nobodyさん
04/08/01 15:25ID:???$a%2000
じゃダメなのか?
0558nobodyさん
04/08/01 15:30ID:???? 'つるー'
: 'ふおるす';
でもやっぱり $a % 2000 だよなぁ。。。@こっちの方が遅かったりして。
0560nobodyさん
04/08/01 16:44ID:???特に速度が肝にならないのであれば、
「意味」がわかりやすいコードを採用するべきだと思う。
なのでふつーは $a % 2000 とするんじゃないかな。
0562nobodyさん
04/08/03 16:53ID:???log.apディレクトリ以外にアクセスした場合にのみ、転送させたいのですが
正規表現がよくわからずお手上げ状態です。
どなたかヒントだけでもいいので教えていただけないでしょうか
0563nobodyさん
04/08/03 16:58ID:9nB7Zn3+0565nobodyさん
04/08/03 17:08ID:9nB7Zn3+こうか?
0567nobodyさん
04/08/05 19:56ID:???Perlで&を&amp;
に変えた後
if($message =~ /http:\/\/([a−zA−Z0−9¥.¥/¥−+#_?〜&¥%=^¥@:¥;]+)/i){
$1 =〜 s/amp¥;//g;
}
で&amp;から&に直しました。。
しかし$1の行でエラーが出ます。
さて、どうしてですか?
0570nobodyさん
04/08/05 23:09ID:???と、釣られてみる
0571nobodyさん
04/08/06 00:32ID:???もし不快感を催したのであれば、心からお詫び申し上げます。
しかし、私がこれを記していない事は確かです。
語調、時間差での間違いからそれは明らかです。
それを理解の上でのご返答・ご指摘宜しく御願致します。
0572nobodyさん
04/08/06 12:07ID:4bPJPC+C0574nobodyさん
04/08/06 17:13ID:???0575nobodyさん
04/08/06 22:55ID:???0577nobodyさん
04/08/07 03:48ID:???確か global の略だったと思う。
パターンにマッチしたのは全部片付けちまいな、の意。
# >>576がなんで >>121 を指してるのかが気になる。
0578nobodyさん
04/08/09 18:35ID:???$value = qq|<a href="hogehoge.html">test</a>|;
$value =~ s/<.*?>//g;
print $value;
でHTMLタグを削除できるけど、これの仕組みがわからない。
*→0回以上一致する
?→0回または1回一致する
.→???????
エロイ人解説おながいします
0579578
04/08/09 18:44ID:???見てた解説サイトにだけちょうどなかったorz
でも*?とする意味はまだわからないでつ;
0580nobodyさん
04/08/09 18:45ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlre.html
0581578
04/08/09 19:05ID:???>>580
どうして?を付けるとそうなるのかが・・・・
例えば
$test = "<aiu>test</aiu>";
$test =~ s/<.*?>//g;
としたときに.*だけですべてをひとつの文字列として捉えそうなのに(現に?がないとそうなりますが)
?を付けるだけで・・・うまくいえないorz
?がコンパイルされる瞬間はいつなんですか?
<.*の時点で可能な限りマッチしますよね・・・っていうかその時は>これはあってもなくても<.*だけで
最後まで一致するから、じゃあ>はいつコンパイルされるんだ???
もしも
s/<<.*>>//g;
としたら先に<<>>を優先してあまった文字に対して.*をやるのかな?駄目だ・・これじゃ
漏れの疑問をエロイ人に理解してもらうことすらできないorz
0582nobodyさん
04/08/09 20:25ID:???*? で一塊の量指定子。量指定子としての * と量指定子としての ? を
並べて書いてるわけじゃない。
$test = "<aiu>test</aiu>"; として、
最長マッチ (<.*>) の場合:
1. $test の最初の < と パターンの < がマッチ
2. .* は「何か0文字以上を最大限」だから、aiu>test</aiu> にマッチ
3. パターンにはまだ > が残っているが、文字列は全部調べ尽くしたので
一旦マッチ失敗。
4. .* は「0文字以上」でさえあればいいので、食べちゃった文字を一文字
ずつ吐き出し、再試行できる (バックトラック) 。
5. .* にマッチした aiu>test</aiu> から最後の > を除外し、.* の次の
パターンである > と比べる。
6. $test の最後の > とパターンの > がマッチ
7. パターンが全てマッチ ( < と aiu>test</aiu と > )
最短マッチ (<.*?>) の場合:
1. $test の最初の < と パターンの < がマッチ
2. .*? は「何か0文字以上を最小限」だから、( < と a の間にある) 空文字列
にマッチ
3. a はパターン > にマッチしないので一旦マッチ失敗。
4. .*? は「0文字以上」でさえあればいいので、もっと詰め込む事もできる。
5. .*? に a を食わせる事にして、i と > を比べる。
6. 同様にパターン > が $test 中の > にぶつかるまで試行を繰り返す。
7. パターンが全てマッチ ( < と aiu と > )
0583nobodyさん
04/08/09 21:34ID:???どのようにしたらいいんでしょうか?
例)
aaabbb ERROR aaabbbccc ABC dddeee
aaabbbcc ABC cdddeee
ERROR aaabbbcccddd ABC eee
というようなテキストがあるとして
errorを含まずABCを含む行だけ(この例では2行目)を
マッチさせたいんですが。
0584nobodyさん
04/08/09 21:44ID:???http://www.din.or.jp/~ohzaki/regex.htm
^(?=.*ABC)(?:(?!ERROR).)*$
0585nobodyさん
04/08/09 21:46ID:???@match_lines = grep((!/error/i and /\bABC\b/), split /\n/, $Strings);
0586nobodyさん
04/08/09 22:00ID:???しかし、教えてくださったやり方だと、自分の使っている
エディタ(Peggy)ではできないです。
これはPerlで使える方法なのでしょうか?
(Perl知りませんが。。。もしかしたらjavaの
OROとかでも使えるのだろうか?)
ちなみに秀丸エディタでは前方一致とか後方一致で
マッチさせることができるみたいですね。
そこまでいかない普通の?正規表現しか使えない環境でこれは
実現できないものでしょうか??
0587nobodyさん
04/08/09 22:05ID:???0588nobodyさん
04/08/09 22:22ID:???ちょっと見てみます。
でもすでにPeggyをシェアウェアとして長く使っており、
見やすい配色になれてしまったので、
今から乗り換えるつもりはないですが。。。
必要なときだけ使う形でいくしかないかな。
あ、でもこれ使用期限とかあるのかな。
0591
04/08/10 13:43ID:2tv/OiLj便乗させてください。
if ($FORM{'name'} !~ /^(\x82[\x9f-\xf1]|\x83[\x40-\x96]|[\x88-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/){ &error; }
↑
ここから漢字とひらがなも省いて「全角カタカナのみを許可」という形にするにはどうればよいでしょうか。
0592nobodyさん
04/08/10 20:24ID:???http://www.din.or.jp/~ohzaki/perl.htm#Character
0594nobodyさん
04/08/12 12:26ID:wFKNBEiY080-1234-5678
とか
03-1234-4321
とか
080-1234-5678
とか
08012345678
とか
0312344321
0595nobodyさん
04/08/12 13:04ID:???0597nobodyさん
04/08/12 14:23ID:???■ このスレッドは過去ログ倉庫に格納されています