正規表現道場@2ch Part2

このエントリーをはてなブックマークに追加
932nobodyさん:03/11/07 14:22 ID:???
>>930
実装言語は Perl ? $html に HTML 全体が入ってるとして、
$html =~ s/(<\/table>)\s*(<table)/\1\n\n\n\2/ig;
933930:03/11/07 14:28 ID:???
>>931
解決しました。ありがとうございました。
934nobodyさん:03/11/10 16:07 ID:???
>>933
931で解決なのかよ!
935932:03/11/10 17:40 ID:???
(⊃д`)
936nobodyさん:03/11/11 10:46 ID:???
(⊃д`)ヽ(゚Д゚ )ヨシヨシ
937nobodyさん:03/11/11 11:28 ID:???
ネタで解決ってのも珍しいな
938nobodyさん:03/11/12 06:23 ID:VJcp1gvZ
質問です。

例えば、以下のようなデーターが別ファイルになっていた時、

$ab_cd = '12ab' ; # aaaaaa
$efg_h = 'あいう'; # ccccc

これを、
$in[0] = abc_cd
$in[1] = efg_h
$aa[0] = 12ab
$aa[1] = あいう
のように取り出す方法と、値を変えてもとの位置に置き換える方法の二つをお願いします。
939nobodyさん:03/11/12 10:26 ID:???
>>938
それは正規表現で解決できる問題じゃないと思う。
940nobodyさん:03/11/12 14:39 ID:VJcp1gvZ
いや、だから、正規表現の部分で教えてほしい事柄とは検索と置換なんです
前にですね、
@buffer = <IN>;
foreach $line (@buffer) {
if( $line =~ /(この部分が不明)/)[
$in[0] = $1; $aa[0] = $2;
}
}
といったようなものを見かけましたので、「(この部分が不明)}として示した部分を教えてもらえば何とかなると思ったのです。
941nobodyさん:03/11/12 14:41 ID:???
いや、だから、
いや、だから、
いや、だから、
いや、だから、
942nobodyさん:03/11/12 14:45 ID:???
>>940
かなり適当。
/^\$(\w+)\s*=\s*([\'\"])([^\'\"]+)\2/
943nobodyさん:03/11/12 19:02 ID:???
>>940
じゃあ最初からそれを書(ry
情報の小出しはよくない。
944nobodyさん:03/11/12 20:13 ID:VJcp1gvZ
>>942
うまくできました。ありがとうございました。
945nobodyさん:03/11/12 21:54 ID:VJcp1gvZ
忘れていましたので、再び質問です。

@wday = ('日','月','火','水','木','金','土') ;

といった感じのものを、「wday」と「'日','月','火','水','木','金','土'」として取り出す正規表現を教えてください。
946nobodyさん:03/11/12 21:58 ID:???
>>945
まずは自分でどこまで考えたか示せよ。
947nobodyさん:03/11/12 22:06 ID:???
前のもそうだけど「wday」を得たいとか言うのからしておかしいよな
根本的なコードの書き方に疑問が
948nobodyさん:03/11/12 22:30 ID:VJcp1gvZ
>>947
「wday」は例で、
@abc = ('aa','bb','cc'); #aaaaaa
の場合の、「abc」と「'aa','bb','cc'」でも良いのです。
$in = $1; $dd{$in} = $2; として取り出したいだけなので。
949nobodyさん:03/11/12 22:46 ID:???
いや、だから、それがおかしいと言ってるのだが
ま、好きにすればいいや
950nobodyさん:03/11/12 23:07 ID:???
>>949
漏れはその気持ちはわからないでもないよ。
たとえば、そういう糞コード書き散らした香具師がいて、
ハードコードしてたデータをハッシュテーブルに直す修正を一括して行いたい、とか。

>>948
例によってかなり適当。
/^\@(\w+)\s*\=\s*\(([^\)]*)\)/
951nobodyさん:03/11/12 23:54 ID:VJcp1gvZ
>>950
ありがとうございました。うまくいきました。
952nobodyさん:03/11/13 09:30 ID:???
>>950 この程度のことを自力で解決できない香具師はまた糞コードを書き散らすと思われ
953nobodyさん:03/11/13 09:40 ID:???
俺は、糞コードを撒き散らしながら今日まで成長してきた。
954nobodyさん:03/11/13 09:57 ID:???
俺は、糞を撒き散らしながら(ry
955nobodyさん:03/11/13 10:29 ID:???
俺は、糞を巻きなが(ry
956nobodyさん:03/11/13 11:33 ID:???
俺は、糞
957nobodyさん:03/11/13 23:30 ID:???
bokuso
958nobodyさん:03/11/13 23:37 ID:???
僕掃除当番
959nobodyさん:03/11/14 22:03 ID:???
姉妹スレ
最近うんこ喰ってる?
http://okazu.bbspink.com/test/read.cgi/ascii/1062511008/
960nobodyさん:03/11/15 02:12 ID:???
PHPでの正規表現について質問です。


if (ereg("<(.*@docomo\.ne\.jp)>",$str,$match)) { // i
}elseif (ereg("<(.*@ezweb\.ne\.jp)>" ,$str,$match)) { // ez
}elseif (ereg("<(.*@[dhtckrnsq]\.vodafone\.ne\.jp)>", $str ,$match)){ // v
}elseif (ereg("<(.*@jp-[dhtckrnsq]\.ne\.jp)>" , $str ,$match)){ // j
}else{
}
return $match[1];


というような動きの関数を作りました。
$strには複数の< > 付きメールアドレスがあります。
その文字列の一番最初に見つけた<>付きメールアドレスから
<>をとった純粋なメールアドレスを取得したいと思っております。
今のままですと、メールの後のほうにある>に反応してしまいます。

どうぞお知恵をお貸しくださいっっ。
961nobodyさん:03/11/15 12:09 ID:???
PHPのことは全くもって知らないんだけど
(.*@docomo\.ne\.jp)

([^>]+?@docomo\.ne\.jp)

こういうのってPHPじゃ使えないの?
962nobodyさん:03/11/15 12:34 ID:???
>>961
[^>]+なら最短マッチにしなくても最初の>で止まるし。
つかRFC2822的には@の前に>来てもOKだし。
0文字のユーザ名を許可しないなら.+?でいいのでは。

>>960
私もPHP知らんけどeregでは最短マッチ使えなくて
preg_matchを使えって事らしい。ググって。
963nobodyさん:03/11/15 14:09 ID:???
RFC的な話は別にして、メールアカウントとして普通に認められる文字って
英数と - _ ぐらいだと思う(Yahoo mailでは - も使えなかった)ので
[-\w]+?@docomo\.ne\.jp で充分なんじゃない?
後ろに @ があるので最短マッチにせず
[-\w]+@docomo\.ne\.jp でも同じだと思うけど。
余計なものはなるべく認めないという方向で。
964nobodyさん:03/11/15 15:16 ID:???
>>963
せめて先頭はアルファベットくらいは判別した方が。
965nobodyさん:03/11/15 15:33 ID:???
docomoのメルアドって今でも電番だけのやつって通用するのかな?
だとすると先頭をアルファベットに限定するのはマズイかも
0で始まるのだけ含むってのはアリかもしれないけど
966nobodyさん:03/11/15 17:19 ID:???
(´-`).。oO(なんで RFC を無視しちゃうんだろうねぇ。。。)
967nobodyさん:03/11/15 17:23 ID:???
>>963
スレ違いな話になるけど、DoCoMo は . も使える事が名言されている。
http://www.docomo-kansai.co.jp/i-mode/qa/guestion_04.html
そして RFC 的には不正な、@ 直前に . が来るメールアドレスも実際に
使われている。旧 J-Phone は更に / ? + が使えるらしい。

こういったケースにぶつかる度に変更を加えていくのは泥沼なので、
最初から「\w と - のみ」のようにキツめのハウスルールを課すよりは
寛容なルールを採った方が、運用時に問題が出にくい。
968nobodyさん:03/11/15 17:26 ID:???
>RFC 的には不正な、@ 直前に . が来るメールアドレス
いったいどのRFCに使えないなんていう記述が?
969nobodyさん:03/11/15 17:36 ID:???
PerlメモのURL文字列を判別するやつのように
RFC完全準拠となると実用に耐えない正規表現になることもあるので
ほどほどにってことで。特にRFC崇拝者は。
970nobodyさん:03/11/15 18:05 ID:???
>>968
RFC 2822 より

addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part

dot-atom = [CFWS] dot-atom-text [CFWS]
dot-atom-text = 1*atext *("." 1*atext) ; 注目

obs-local-part = word *("." word) ; 注目
word = atom / quoted-string
atom = [CFWS] 1*atext [CFWS]

atext = ALPHA / DIGIT /
    "!" / "#" / "$" / "%" / "&" / "'" /
    "*" / "+" / "-" / "/" / "=" / "?" /
    "^" / "_" / "`" / "{" / "|" / "}" / "~"

よって local-part の途中に . が来るのは OK ([email protected])
だが、末尾 (@ の直前) に来るのは NG ([email protected]) 。
971nobodyさん:03/11/15 22:08 ID:???
>>969
お前が RFC を読めないからって滅茶苦茶言うなよ。
972nobodyさん:03/11/16 11:50 ID:???
>>969は、保守性と処理速度を鑑みて「実用に耐えない」だと思う。
973nobodyさん:03/11/16 12:34 ID:???
>>972
ということにしたいのですね? :-)
974nobodyさん:03/11/16 14:15 ID:???
速度も保守性もそれほど違わんと思うが...。
単に分かったとこだけで済ましとこうというのが
本音のような気もする。
(?:(?:[a-z]|[A-Z])(?:(?:[a-z]|[A-Z])|[0-9]|[-+.])*:(?:(?://(?:(?:(
?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])
(?:[0-9]|[A-Fa-f])|[;:&=+$,])*@)?(?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9]
)|(?:(?:[a-z]|[A-Z])|[0-9])(?:(?:(?:[a-z]|[A-Z])|[0-9])|-)*(?:(?:[
a-z]|[A-Z])|[0-9]))\.)*(?:(?:[a-z]|[A-Z])|(?:[a-z]|[A-Z])(?:(?:(?:
[a-z]|[A-Z])|[0-9])|-)*(?:(?:[a-z]|[A-Z])|[0-9]))\.?|[0-9]+\.[0-9]
+\.[0-9]+\.[0-9]+)(?::[0-9]*)?)?|(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[
-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[$,;:@&=+])+)(?:
/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(
?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[
-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*(?:
/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(
?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[
-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*)*)
?|/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f]
)(?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])
|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*(
?:/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f]
)(?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])
|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*)
*)(?:\?(?:[;/?:@&=+$,]|(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%
(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]))*)?|(?:(?:(?:(?:[a-z]|[A-Z])|
[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[;?:@&=+
$,])(?:[;/?:@&=+$,]|(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:
[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]))*)|(?://(?:(?:(?:(?:(?:(?:(?:[a-
z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]
)|[;:&=+$,])*@)?(?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|(?:(?:[a-z]|[A-
Z])|[0-9])(?:(?:(?:[a-z]|[A-Z])|[0-9])|-)*(?:(?:[a-z]|[A-Z])|[0-9]
以下省(ry
976nobodyさん:03/11/16 19:12 ID:???
おしい。
ちょい工夫するともっと分かりやすく正確な表現になる。

って大昔からくりかえし話題になるネタだけど。
実際上はそこまでしないで逃げる罠。
977nobodyさん:03/11/16 21:24 ID:???
>>960 の目的はメールアドレスが RFC 的に valid かを調べる事じゃ
ないし、domain は固定なので、厳密に調べるにしても必要なのは
local-part の正規表現だけだ。

my $atext = qr"[!#\$%&'*+\-/0-9=?A-Z^_`a-z{|}~]";
my $qtext = qr/[^\x0A\x0D"\\\x80-\xFF]*/;
my $valid_local_part = qr/
  (?:$atext+(?!$atext)|"$qtext(?:\\[^\x80-\xFF]$qtext)*")
  (?:\.$atext+(?!$atext)|"$qtext(?:\\[^\x80-\xFF]$qtext)*")*
/x;

. の使い方に目くじらを立てなければこうできる。

my $loose_local_part = qr{
  (?:
    [!#\$%&'*+\-./0-9=?A-Z^_`a-z{|}~]+
  |  "$qtext(?:\\[^\x80-\xFF]$qtext)*"
  )+
}x;

これで foo.bar.@domain も "(>_<)\ {@o@}"@domain も通る。
978nobodyさん:03/11/18 02:53 ID:???
クエリのチェックをしようとしているのですが、どうすれば良いのでしょうか。
形式は「一つの組は英数字=英数字、複数ある場合は&区切り」という一般的なもので、
ここでのチェックは単にその形式に沿っているかどうかを判断するだけとしたいと思い

m/^(((\w*?)?=?(\w*?)?)?(\&?))+$/

とやってみたのですが、「=」が二つ続いていたら通ってしまうなど駄目なようで、
この辺りで詰まって解らなくなり質問に来た次第です。
979nobodyさん:03/11/18 04:02 ID:???
>>978
英数字は空文字を許さない、とかなら、こんなんでいいのでは?
「英数字=英数字」、複数ある場合はこの後にさらに「&英数字=英数字」を繰り返し。
m/^\w+\=\w+(?:\&\w+\=\w+)*$/
980nobodyさん:03/11/18 04:14 ID:???
「英数字=なし」もあるよね
これでうまくできた気がするけど

\w+?=\w*?(&\w+?=\w*?)*
981nobodyさん
>>973-974
じっくり読んでみてやっと理解できました…どうもです。