正規表現道場@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/
0747744
04/10/03 04:57:52ID:???回答ありがとうございます。
XREA を利用しているので PHP の 4.3.8 を利用しているのですが、
Warning: ereg_replace(): REG_BADRPT が出てしまいました
(いろいろ試したみたところ、 (?= に反応しているようでした)。
preg mb_ereg でも同様のコードを試してみたところ (?= はパスするものの
ereg と違って [:graph:] に日本語がマッチしてしまうようです(こっちが正しいのかな?)。
745のコードを参考に mb_ereg で以下のように書き直してみたところなんとか動作しました。
$mes = mb_ereg_replace('([a-zA-Z.]{2,})((?=[^a-zA-Z0-9<>":;.,/=?+_&@\-])|$)',
'<a href="keyword.php?q=\1">\1</a>', $mes);
よくわからないのですが、[:alpha:]を使うと漢字にマッチしたりして挙動が変になっていました。
うーん、まだまだ勉強が必要です。
0748nobodyさん
04/10/03 05:14:58ID:???0749nobodyさん
04/10/03 05:29:07ID:???例によって>>1の正規表現メモんとこ参照すると分かりやすい。
0750nobodyさん
04/10/03 22:20:30ID:???あるシステムの独自タグをあつかっています。
<XXXX Name = Test1 number = 1 value1 = "テスト" value2 = "テスト\"ああ\"" value3="テスト3 \t test">
</XXXX>
という具合に、<XXXX で始まるタグの中にかかれた各属性と値をそれぞれ分割したいのです。最初、Javaプログラムで頑張って書いていましたが、
へたれな自分のプログラムが長くなってしまいバグも所々に…。くせものが属性と値の表記で、valueというキーの値がaaaa としても、
value = aaaa の場合
value = "aaaa" の場合で異なる値にしたい(" がポイント)
value=aaaa や、途中で改行やタブが入る、
value=
aaaa
といった場合もあります。
値の中に、ダブルクォーテーションが入る場合やスペースが入った場合を考慮してJavaプログラムで何とかしようと思ってましたがスパゲッティ状態です。
正規表現でエイヤっと属性名と値で分割させたいのですが、、、>>1のサンプルをあさってますが、もし、何か良いモノ知っていましたら教えてください。
0751750
04/10/03 22:21:42ID:au5XkXk90752nobodyさん
04/10/04 01:59:41ID:???その独自タグの仕様をはっきりさせなければ誰もわからんよ。
「=」の隣にスペースが入っていたりダブルクォートでくくっていたり
いなかったりしてるし。
0753nobodyさん
04/10/04 02:00:16ID:???/(.+?)[\n\s]*=[\n\s]*("(\\"|[^"])+"|[^\s]+)(?:[\n\s]+|$)/; #$1=属性, $2=値
やっとできた・・・。
\"を含める方法とか、勉強になりました。
0754753
04/10/04 02:10:49ID:???そうだ、
>value = aaaa の場合
>value = "aaaa" の場合で異なる値にしたい(" がポイント)
これがどういう結果を望んでいるのか分からないままやってたw
とりあえず、ダブルクォートは残す仕様にしておいたけど。
0755750
04/10/04 07:43:16ID:3m/jnQ5F>>752にあるように、= の両隣は、スペースが入ったり、入らなかったりします。厳密にはJavaでいうところのホワイトスペースを許可してて、タブとか全角スペースなどもありです。ここは許可しないことを改善してもらうつもりです。
あとで結果報告しますね。ありがとう〜
0756nobodyさん
04/10/04 11:31:31ID:???みんなが使ってるフォーマット (XML ね) にしてもらうようにした方が良いと思う。
0757nobodyさん
04/10/04 15:15:50ID:???0758nobodyさん
04/10/11 11:12:51ID:ek9GJkPHEZwebの絵文字をShift_JISコードに変換する正規表現を書いたつもりなのですが、
”♪”マークなど一部の絵文字以外の記号にマッチしてしまいます・・・。
(使用言語:PHP 4.3.3)
$sjis='[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
$text=preg_replace("/((?:$sjis)*)([\xf3-\xf7][\x40-\xfc])/e","'\\1['.bin2hex('\\2').']'",$text);
EZweb絵文字だけにマッチさせるようにするには、どうのように直したら良いでしょうか?
よろしくお願いします。
0759nobodyさん
04/10/12 01:28:24ID:???そこら辺は大丈夫?
0760759
04/10/12 01:34:03ID:???[顔文字]♪
のパターンが良くないのね。
今まで
♪[顔文字]
でやってたから気づかなかった。
言い訳だけど、具体的にどういうパターンがダメなのか書いてほしかったな。
0761759
04/10/12 03:17:53ID:???sjisの漢字の範囲は[\x81-\x9F\xE0-\xEF][\x40-\x7E\x80-\xFC]じゃない?
てなわけで、とりあえずこれ。
/($sjis)([\xf3-\xf7][\x40-\xfc])/e
でも、これでは絵文字が連続した場合は変換できない。
やはり、どこが1バイト目か2バイト目か分かるように、
あらかじめ明確に文字を区切らなきゃいけないっぽい。
$text = preg_replace("/($sjis)/", "$1 ", $text);
$text = preg_replace("/([\xf3-\xf7][\x40-\xfc])\s/e", "'['.bin2hex(\\1).'] '", $text);
こんな感じにすれば確実。もっといい方法あれば良いんだけど。
PHPはやったことないので、細かい間違いはご容赦・・・。
0762nobodyさん
04/10/12 14:09:22ID:oX6FVXHmperl のマッチングで文章中の全角数字を的確に取得したいのですが、
どうにもこうにも化けてしまいます。
$value = "もしかして762はバカ?";
if($value =~ /([0123456789]*)/){
$match = $1 ;
print "$match \n"; #←「・」となってちゃんと取得できてない
}
環境:
Perl5 (ActivePerl)
Win2k
文字コードはSJISで。
どうすればよいのでしょうか・・・
0763nobodyさん
04/10/12 14:22:00ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0764nobodyさん
04/10/12 14:39:46ID:???$value = "実は764は変態?";
if($value =~ /(\x82[\x4F-\x58]\x82[\x4F-\x58]\x82[\x4F-\x58]|\x82[\x4F-\x58]\x82[\x4F-\x58]|\x82[\x4F-\x58])/){
$match = $1 ;
print "$match \n";
}
ありがとうございました。
0765759
04/10/12 14:52:38ID:???/((?:\x82[\x4F-\x58])+)/
0766nobodyさん
04/10/12 20:54:11ID:???0767758
04/10/12 22:55:44ID:c8Tbm8wXレスありがとうございます。
ちょっと質問がわかりにくくてすみません。
具体例を出すと、以下のような感じです。
$sjis='[\x81-\x9F\xE0-\xEF][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
$text="今日はカレーだ♪るんるん♪";
$text=preg_replace("/((?:$sjis)*?)([\xf3-\xf7][\x40-\xfc])/e","'\\1['.bin2hex('\\2').']'",$text);
print $text; // ← '今日はカレーだーf482]驍驍'
それで、昨日からいろいろ試したところ、
$text=preg_replace("/\G((?:$sjis)*?)([\xf3-\xf7][\x40-\xfc])/e","'\\1['.bin2hex('\\2').']'",$text);
とすることで、ウチの環境では解決しました。
ですが、レン鯖(PHP 4.0.6)ではEZweb絵文字に全くマッチしなくなりました・・・orz
どなたかアドバイスよろしくお願いします。
もしPHP固有の問題であるなら該当スレに移動します。
0768758
04/10/12 23:07:38ID:???>>761で教えていただいた方法ですが、
$text="今日はカレーだ♪るんるん♪"; // 最後の文字は SJISコードF6CFの絵文字
$text = preg_replace("/($sjis)/", "\\1 ", $text);
$text = preg_replace("/([\xf3-\xf7][\x40-\xfc])\s/e", "'['.bin2hex(\\1).']'", $text);
print $text; // ←'今 日 は カ レ ー だ ♪ る ん る ん ♪ [f6cf]'
となって、文字ごとにスペースが入ってしまい、
そうかと言って
2行目を $text = preg_replace("/($sjis)/", "\\1", $text); に変えたら
'今日はカレーだ♪るんるん♪'(変化無し)という状況です・・・。
0769nobodyさん
04/10/13 19:34:15ID:???$text = '$a = "foo"bar"; $b = "hoge"huga"hage";';
これを'$a = "foo\"bar"; $b = "hoge\"huga\"hage";'にしたいです。
0770nobodyさん
04/10/13 19:50:38ID:???無理。というか無茶。
「ダブルコーテーションの内側」の文字列や $text 全体に、
何か一定の制限や特性があるならなんとかできなくもないかも知れないけど。
0771nobodyさん
04/10/13 20:05:36ID:???0772nobodyさん
04/10/13 20:10:59ID:???Perl なら
$text =~ s{\x20"(.*?)";}{ (my $str = $1) =~ s/"/\\"/g; qq|\x20"$str";| }eg;
0773nobodyさん
04/10/13 20:14:38ID:???$text =~ s{(?<=\x20")(.*?)(?=";)}{ (my $str = $1) =~ s/"/\\"/g; $str }eg;
0774nobodyさん
04/10/13 20:48:20ID:???サンクス。とりあえずそれでできましたが、
$text = '$a = "foo";bar";';
みたいなケースも考えるときついですね。
とりあえず、出直してきます。
0775nobodyさん
04/10/14 02:46:56ID:???1.sjis-winをutf8にする
2.utf8はsjisやeucのような途中マッチが起こらない
3.そのためにはソースもutf8で書いた方がよい
4.utf8でezweb文字列の正規表現を書く
うまくできたらソース晒してね
0777nobodyさん
04/10/14 07:09:58ID:???"\xF6\xCF" -> "\xEE\x93\xB6"
0778776
04/10/14 14:00:36ID:???調べてみたら、
- EZweb の絵文字は Shift_JIS のユーザ定義領域を使っていて、
- Shift_JIS のユーザ定義領域は Unicode との対応が定義されている
なので、ちゃんと相互変換もできるし問題ないということなのかな。
漏れが無知だったようだ。すまん。
0779nobodyさん
04/10/16 19:49:17ID:???0782nobodyさん
04/10/16 20:07:41ID:??????
0783782
04/10/16 20:14:15ID:???間違ってたらスマソ。
叩かないで(´・ω・`)
0785nobodyさん
04/10/16 20:18:33ID:???0786nobodyさん
04/10/16 20:25:55ID:???0788782
04/10/16 20:28:35ID:???こうかな?
0790782
04/10/16 20:32:35ID:???0794782
04/10/16 20:39:32ID:???0がひとつ多かったみたい
(・∀・)
0795nobodyさん
04/10/16 20:41:25ID:???0796782
04/10/16 20:42:46ID:???これで最後・・・修行してきまつ
0797nobodyさん
04/10/16 20:55:24ID:???0798nobodyさん
04/10/16 21:01:13ID:???0799nobodyさん
04/10/16 21:02:00ID:???素直に/[5-9][0-9][0-9]/でいいんちゃうの?
0800nobodyさん
04/10/16 21:03:45ID:???0801nobodyさん
04/10/16 21:04:15ID:???馬鹿がキタ━━━━━━(゚∀゚)━━━━━━ !!
お前な、上のやつよーく見ろ。
0802nobodyさん
04/10/16 21:05:12ID:???このスレ馬鹿しかいないってことでFA?
0805nobodyさん
04/10/16 23:28:12ID:???だから?
0806779
04/10/17 00:19:04ID:???0808nobodyさん
04/10/18 04:08:53ID:aBkVRsoLはどういう意味ですか?
0809nobodyさん
04/10/18 04:13:49ID:???0810nobodyさん
04/10/18 11:03:43ID:???って、MLとマルチポストするなよ。
0811nobodyさん
04/10/18 11:29:23ID:???0812nobodyさん
04/10/18 12:01:37ID:???'\' 俺が悪いのか?
-
v'\'v そうさ。
o
0813nobodyさん
04/10/18 12:42:55ID:???ていうか、記号をわざわざ全角で書いてるひとが多いけど、なんでなんでしょ?
'&' や '"' と同じような罠にはまるのを避けてるのかな?
0814nobodyさん
04/10/18 13:11:12ID:???SafariだとASCII or Unicode以外でポストするとき、迷惑にも
? -> \, ? -> 〜 に変換しやがるのです。
0815nobodyさん
04/10/18 13:13:22ID:???バックスラッシュ・チルダが全角バックスラッシュ・全角ウェーブダッシュにされるんです。
0816nobodyさん
04/10/18 13:43:13ID:???よくプログラミングネタや UNIX のトラブルシュートネタで、
コードやエラーメッセージをそのまま貼れ、って言うことがあるけど、
そういうのがあるとすると厄介ですなあ。
0817nobodyさん
04/10/22 17:38:02ID:xzmN9eHo言語はperlです。
-----------
sub aaa{
1
2
}
\n
sub bbb{
3
}
\n
\n
------------
この場合
-----------
aaa{
1
2
}
\n
と
bbb{
3
}
\n
\n
と
出力したいのですが。
よろしくお願いします。
0818nobodyさん
04/10/22 18:28:19ID:???つまらん
0819817
04/10/23 01:25:36ID:fB1MfhBi$data=~ s/([\s;{}]*)#[^\x0A\x0D]*/$1/g;
$data=~ s/[\x0A\x0D]__(?:END|DATA)__.*//s;
@result= $data=~ /\s+sub\s+([a-zA-Z_]\w*\s*(?:\([^)]*\))?\s*\{(?:[^}]|\{[^}]*\})*\})/g;
これでどう?
0821nobodyさん
04/10/23 13:52:56ID:fB1MfhBi$data=~ s/[\x0A\x0D]=\w+.*?=cut//gs;
$data=~ s/([\s;{}]*)#[^\x0A\x0D]*/$1/g;
$data=~ s/[\x0A\x0D]__(?:END|DATA)__.*//s;
@result= $data=~ /\s+sub\s+([a-zA-Z_]\w*\s*(?:\([^)]*\))?\s*\{(?:[^}]|\{[^}]*\})*\})/g;
print @result;
を実行しても
bbb{
3
}
しか表示できません。
@result= $data=~ /\s+sub
を以下に変えないといけないようだ。
@result= $data=~ /(?:^|\s|=)sub
0823nobodyさん
04/10/29 01:30:56ID:???0825nobodyさん
04/10/29 02:35:07ID:???0826nobodyさん
04/10/29 03:55:33ID:???s/([^\^{}])\n/$1/g; # unixの改行
s/([^\^{}])\r\n/$1/g; # windowsの改行
s/([^\^{}])\r/$1/g; # Macの改行
0827nobodyさん
04/10/29 06:16:46ID:???0828826
04/10/29 12:08:28ID:???s/(^|[^{}])\n/$1/g;
だた。
0830nobodyさん
04/10/29 13:51:59ID:???829でできました。
0831nobodyさん
04/10/29 15:00:41ID:???また、829では先頭の改行を削除できない。
直前のパターンを指定する場合、普通は
(?<=PATTERN) や (?<!PATTERN) を使う。
この場合なら、s/(?<![{}])\n//g; とする。
>>829
次に回答するときはちょっとでも試行の跡を見せれ。
0833nobodyさん
04/10/29 16:20:34ID:???# 「直前が { もしくは } の改行のみ残る」なら、これは3行になる筈
my $orig = "\n\nfoo\n\n{\nbar\n}\n\nbaz\n\n";
(my $copy = $orig) =~ s/(^|[^{}])\n/$1/g; # 828
print "[$copy]\n";
# [
# foo
# {
# bar}
# baz]
# … NG.
($copy = $orig) =~ s/(?<![{}])\n//g; # 831
print "[$copy]\n";
# [foo{
# bar}
# baz]
# … OK.
0834nobodyさん
04/10/29 16:25:51ID:???$_ = <<EOH;
abc
123
EOH
の時、1行目のが「先頭の改行(^\n)」で、
abcの後ろと次の空行の改行が「続く改行(\n\n+)」。
これを>>828に通すと
abc
123
となり、>>831に通すと
abc123
となる。
{ と } の後ろ以外の改行は消すんだったよな?
恥の上塗りご苦労。
0835nobodyさん
04/10/29 16:32:05ID:???833-834を踏まえた上で、828が正解である根拠を述べよ。
831が正解。
頭良くなってから偉そうなこと言えよな。
0836nobodyさん
04/10/29 16:34:53ID:???ばか?変数に入れたものなんか誰も処理しないよ。
変数に書いてる間にエディタで取った方が速いよ。
普通のファイルでやって皆。
--------
foo
{
bar
}
baz
-----------
0838825
04/10/29 16:40:55ID:???0839nobodyさん
04/10/29 16:43:14ID:???いちいちヒアドキュメントなんか書いてる間に
(あるいはスクリプトに挿入してEOHなんてやってる
間に)エディタの置換でやったほうが速いよ。
>>831が間違いだと言ってないからな。
ただ、否定の?は遅いからな(プッ
0840nobodyさん
04/10/29 16:46:04ID:???0841nobodyさん
04/10/29 17:58:19ID:jREmvBrxどう書けばいいのでしょうか?
abc dfg hij a
を(先頭と最後に3つ空白がある)
abc dfg hij a
みたいにしたいのです。
教えてください。
0842nobodyさん
04/10/29 18:24:10ID:???str = " abc dfg hij a ".replace(/^\s+|\s+$/g, "");
分かりやすく、前後のスペースは全角にしたので注意。
.replaceを適用した文字列や変数自身は置換されないので、
結果を受け取る必要あり。
0843nobodyさん
04/11/02 02:39:16ID:???という文字列があって/*〜*/の部分をereg_replaceで空文字列に置き換えようとしたとき
ereg_replace("(/\*.*\*/)","","/*str1*/str2/*str3*/");
てやると、先頭の/*と末尾の*/がマッチして全部消えるんだけど
test2は残して、test1とtest3だけ消す方法ってある?
0844nobodyさん
04/11/02 04:38:17ID:???( ゚Д゚)
0845nobodyさん
04/11/02 06:03:36ID:???0846nobodyさん
04/11/02 12:08:40ID:???0847843
04/11/02 15:34:08ID:TAdMjWDI>ereg_replace("(/\*.*\*/)","","/*str1*/str2/*str3*/");
>てやると、先頭の/*と末尾の*/がマッチして全部消えるんだけど
>str2は残して、str1とstr3だけ消す方法ってある?
でした。
>>846サソ
(/\*([^*]|\*+[^/*])*\*+/)で、できました〜
ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています