>>930 実装言語は Perl ? $html に HTML 全体が入ってるとして、
$html =~ s/(<\/table>)\s*(<table)/\1\n\n\n\2/ig;
933 :
930:03/11/07 14:28 ID:???
>>931 解決しました。ありがとうございました。
935 :
932:03/11/10 17:40 ID:???
(⊃д`)
(⊃д`)ヽ(゚Д゚ )ヨシヨシ
ネタで解決ってのも珍しいな
938 :
nobodyさん: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] = あいう
のように取り出す方法と、値を変えてもとの位置に置き換える方法の二つをお願いします。
>>938 それは正規表現で解決できる問題じゃないと思う。
940 :
nobodyさん:03/11/12 14:39 ID:VJcp1gvZ
いや、だから、正規表現の部分で教えてほしい事柄とは検索と置換なんです
前にですね、
@buffer = <IN>;
foreach $line (@buffer) {
if( $line =~ /(この部分が不明)/)[
$in[0] = $1; $aa[0] = $2;
}
}
といったようなものを見かけましたので、「(この部分が不明)}として示した部分を教えてもらえば何とかなると思ったのです。
いや、だから、
いや、だから、
いや、だから、
いや、だから、
>>940 かなり適当。
/^\$(\w+)\s*=\s*([\'\"])([^\'\"]+)\2/
>>940 じゃあ最初からそれを書(ry
情報の小出しはよくない。
944 :
nobodyさん:03/11/12 20:13 ID:VJcp1gvZ
>>942 うまくできました。ありがとうございました。
945 :
nobodyさん:03/11/12 21:54 ID:VJcp1gvZ
忘れていましたので、再び質問です。
@wday = ('日','月','火','水','木','金','土') ;
といった感じのものを、「wday」と「'日','月','火','水','木','金','土'」として取り出す正規表現を教えてください。
前のもそうだけど「wday」を得たいとか言うのからしておかしいよな
根本的なコードの書き方に疑問が
948 :
nobodyさん:03/11/12 22:30 ID:VJcp1gvZ
>>947 「wday」は例で、
@abc = ('aa','bb','cc'); #aaaaaa
の場合の、「abc」と「'aa','bb','cc'」でも良いのです。
$in = $1; $dd{$in} = $2; として取り出したいだけなので。
いや、だから、それがおかしいと言ってるのだが
ま、好きにすればいいや
>>949 漏れはその気持ちはわからないでもないよ。
たとえば、そういう糞コード書き散らした香具師がいて、
ハードコードしてたデータをハッシュテーブルに直す修正を一括して行いたい、とか。
>>948 例によってかなり適当。
/^\@(\w+)\s*\=\s*\(([^\)]*)\)/
951 :
nobodyさん:03/11/12 23:54 ID:VJcp1gvZ
>>950 ありがとうございました。うまくいきました。
>>950 この程度のことを自力で解決できない香具師はまた糞コードを書き散らすと思われ
俺は、糞コードを撒き散らしながら今日まで成長してきた。
俺は、糞を撒き散らしながら(ry
俺は、糞を巻きなが(ry
俺は、糞
bokuso
僕掃除当番
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には複数の< > 付きメールアドレスがあります。
その文字列の一番最初に見つけた<>付きメールアドレスから
<>をとった純粋なメールアドレスを取得したいと思っております。
今のままですと、メールの後のほうにある>に反応してしまいます。
どうぞお知恵をお貸しくださいっっ。
PHPのことは全くもって知らないんだけど
(.*@docomo\.ne\.jp)
↓
([^>]+?@docomo\.ne\.jp)
こういうのってPHPじゃ使えないの?
>>961 [^>]+なら最短マッチにしなくても最初の>で止まるし。
つかRFC2822的には@の前に>来てもOKだし。
0文字のユーザ名を許可しないなら.+?でいいのでは。
>>960 私もPHP知らんけどeregでは最短マッチ使えなくて
preg_matchを使えって事らしい。ググって。
RFC的な話は別にして、メールアカウントとして普通に認められる文字って
英数と - _ ぐらいだと思う(Yahoo mailでは - も使えなかった)ので
[-\w]+?@docomo\.ne\.jp で充分なんじゃない?
後ろに @ があるので最短マッチにせず
[-\w]+@docomo\.ne\.jp でも同じだと思うけど。
余計なものはなるべく認めないという方向で。
>>963 せめて先頭はアルファベットくらいは判別した方が。
docomoのメルアドって今でも電番だけのやつって通用するのかな?
だとすると先頭をアルファベットに限定するのはマズイかも
0で始まるのだけ含むってのはアリかもしれないけど
(´-`).。oO(なんで RFC を無視しちゃうんだろうねぇ。。。)
>RFC 的には不正な、@ 直前に . が来るメールアドレス
いったいどのRFCに使えないなんていう記述が?
PerlメモのURL文字列を判別するやつのように
RFC完全準拠となると実用に耐えない正規表現になることもあるので
ほどほどにってことで。特にRFC崇拝者は。
>>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]) 。
>>969 お前が RFC を読めないからって滅茶苦茶言うなよ。
>>969は、保守性と処理速度を鑑みて「実用に耐えない」だと思う。
速度も保守性もそれほど違わんと思うが...。
単に分かったとこだけで済ましとこうというのが
本音のような気もする。
(?:(?:[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
おしい。
ちょい工夫するともっと分かりやすく正確な表現になる。
って大昔からくりかえし話題になるネタだけど。
実際上はそこまでしないで逃げる罠。
>>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 も通る。
クエリのチェックをしようとしているのですが、どうすれば良いのでしょうか。
形式は「一つの組は英数字=英数字、複数ある場合は&区切り」という一般的なもので、
ここでのチェックは単にその形式に沿っているかどうかを判断するだけとしたいと思い
m/^(((\w*?)?=?(\w*?)?)?(\&?))+$/
とやってみたのですが、「=」が二つ続いていたら通ってしまうなど駄目なようで、
この辺りで詰まって解らなくなり質問に来た次第です。
>>978 英数字は空文字を許さない、とかなら、こんなんでいいのでは?
「英数字=英数字」、複数ある場合はこの後にさらに「&英数字=英数字」を繰り返し。
m/^\w+\=\w+(?:\&\w+\=\w+)*$/
「英数字=なし」もあるよね
これでうまくできた気がするけど
\w+?=\w*?(&\w+?=\w*?)*