トップページ⇒php
1001コメント313KB

正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/11/19 21:42ID:Kst3Nn4S
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、&amp " と描いておきましょうね。

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/
0254nobodyさん04/02/21 22:31ID:???
>>253
perl 5.8.x以降限定だけど、

use encoding "shiftjis";
...
s/あ/ん/;
025524704/02/21 22:33ID:???
お前のそのレスみてレベル低いと思った

>PerlはEUCじゃないとマルチバイトの処理できない

↑特にこことか。

jperl とか言い出す始末。。。
0256nobodyさん04/02/21 23:00ID:???
なんか、>>247って必死じゃね?
いや、いいんだけど、>>248と勝手に争ってくれ。
ここ、過疎スレだから、周り気にしないで争ってね、思う存分
0257nobodyさん04/02/21 23:20ID:???
>>252
ありがとうございます。
Shift-Jisで、試してみたところ、
正常動作しているようです。

全角アルファベット数字と記号類も
省きたいと思ってたので助かりました。
025823404/02/21 23:44ID:???
>>236
すまん、意味不明なこと書いちゃった。

MSのWindows ScriptドキュメントでRegExpオブジェクトのヘルプリファレンス読んだんだけど、
RegExp.Execute()のところに、実行するとSubMatchesコレクションが生成されるって記述が
ぜんぜんないんよ。
てなわけで、SubMatchesコレクションの存在を知らなかった……_| ̄|○
(ふだんはBASP21コンポーネントのMatch()やReplace()を使ってるし)
SubMatchesってキーワードでヘルプを調べれば載ってるんだけどね。
025923604/02/22 10:53ID:???
>>258
そういうことっすか。
ちなみにつくるとき、ここを参考にしましたよ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnclinic/html/scripting121399.asp
0260nobodyさん04/02/22 23:25ID:kjGz/T2C
「注目に値[あたい]する特徴[とくちょう]が出せる。」

こういう文章から[あたい][とくちょう]の部分を
一括で削除する正規表現を教えてくれないでしょうか。
Wzの検索、置き換えを使っています。
0261nobodyさん04/02/22 23:39ID:???
s/\[.*?\]//g

とかしか思いつかない漏れはここに似つかわしくないですか
0262nobodyさん04/02/23 05:58ID:???
>>260
[[^]]+]
0263nobodyさん04/02/23 10:39ID:???
abc\,edf,ghi という文字列を
$_[0] = abc\,edf
$_[1] = ghi
という具合に split したいのですが、どうすればよろしいでしょうか?
0264nobodyさん04/02/23 11:51ID:???
>>263
split /(?<!\\),/, $str;

以後、Perl の質問は http://pc2.2ch.net/test/read.cgi/php/1075545279/ へ。
026526004/02/23 14:09ID:???
>>262
出来ました!すごいですね。
自分には難しくて。
ありがとうございました。
0266nobodyさん04/02/23 20:41ID:Ea0t25bl
文字列以外にマッチってできるべか?
こんなふうに書いてみたけどだめやった。
[^(mojiretu)]
それとも(?!)とか工夫すればできるの?
0267nobodyさん04/02/23 20:46ID:???
純粋に!で否定かければいいのでは、とか思いますがどうでしょう
026826604/02/23 21:30ID:Ea0t25bl
レスどうもです、具体的な例を紹介してくれると助かるんすけど、だめすか?
お願いしまぁす。
0269nobodyさん04/02/23 22:14ID:???
Perlなら
$hoge !~ /^mojiretu/g;
で、文字列以外にヒットするはず
0270nobodyさん04/02/24 21:18ID:1VWZCh18
質問です。
アルファベットのみで構成される6文字以上10文字以下の文字列、をcygwinのgrepを用いて検索したいのですが…。

正規表現の紹介をしているところを読んで回り、
^「A-Za-z]{6,10}
で、アルファベット6文字以上10文字以下、を表すということが分かったのですが、

grep -i "^[a-z0-9./]{6,9}"
としてみても何も反応が無く、

egrep -i "^[a-z0-9./]{6,9}"
とすると、11文字や12文字の文字列も引っかかってきてしまいます。

どう書けばアルファベットのみで構成される、6文字以上10文字以下の文字列、を正確に検索出来るのでしょうか?

宜しくお願いします。
0271nobodyさん04/02/24 21:22ID:???
>>270
egrep -iw "^[a-z0-9./]{6,10}"

途方に暮れて質問させていただいた直後に我に返りました。
wというコマンドを使えば出来ました。

スレ汚し失礼しました…。
027227004/02/24 23:35ID:1VWZCh18
スミマセン…もう一度質問させてください…。

http://koho.ktplan.jp/tango/y.html

ここを例にして説明します。
上のサイトを開いて、全部選択してテキストにコピペしてy.txtとして保存。
この中から、6文字以上、10文字以下の英単語だけを抜き取ろうとしています。

$ egrep -iw "^[a-z]{6,10}" y.txt

とすると、

English NaviHome0INDEX1 HELP2 Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq
Rr Ss Tt Uu Vv Ww Xx Yy Zz基本的な英単語 Y
yesterday
yourself
Copyright c 2001-2004 English Navi All Rights Reserved

という結果になります。

English NaviHome0INDEX1 HELP2 Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq
Rr Ss Tt Uu Vv Ww Xx Yy Zz基本的な英単語 Y
と
Copyright c 2001-2004 English Navi All Rights Reserved
の部分が、どうしても引っかかってきてしまいます。
上の書き方だと、間にスペースが入っているものとかを排除できないことは分かったのですが、どうすれば目的の文字数の単語だけが抜き出せるのか…頭がパンパンになって来ました。。。

上手く抜き出すことが出来る正規表現の書き方を教えてください。
よろしくお願いします。
0273nobodyさん04/02/24 23:40ID:???
grepて$つかえたっけ

Perlだと
/^[a-z]{6,10}$/i
で、できるかもしれない。
027427004/02/24 23:46ID:???
>>273
即レスありがとうございます…。

$ egrep -iw "^[a-z]{6,10}+$" y.txt

$ egrep "/^[a-z]{6,10}$/i" y.txt

共にだめでした…。
悩んでみます。
0275nobodyさん04/02/24 23:52ID:???
egrep -iw "^[a-z]{6,10}$" y.txt
じゃないのかと。
027627004/02/25 00:11ID:???
>>275
あ、スミマセン。。。

egrep -iw "^[a-z]{6,10}$" y.txt

です。
何も起きないのです…。
0277nobodyさん04/02/25 00:19ID:???
正規表現メモによると、egrepでは{n,m}をサポートしていないそうだ。

grepなら{n.m}をサポートしているみたいだが。
027827004/02/25 00:22ID:???
>>277
egrepだと、とりあえず>>272の状態まではたどり着くのですが、
$ grep -iw "^[a-z]{6,10}" y.txt
これだと何も起きないのです…。
そもそもgrepやegrepだと無理…なのかな…。
0279nobodyさん04/02/25 00:42ID:???
FreeBSDだけど、こんな感じだよ。

$ egrep -iw "^[a-z]{6,10}$" y.txt
yesterday
yourself
$ egrep -V
egrep (GNU grep) 2.4d
028027004/02/25 01:07ID:???
>>279
FreeBSD、ググッテ見ましたが、自分にはよく理解できませんでした。

自分は
http://sources.redhat.com/cygwin/
このcygwinというのを使用しています。

$ egrep -V
egrep (GNU grep) 2.5

と言うことでした。
つまり、これでは出来ない、ということですかね…。
ありがとうございました。
もうちょっとだけ色々考えてみます。
Copyright c 2001-2004 English Navi All Rights Reserved
↑こういうのが引っかかってくるようだと、英文ページから抜き取ることが出来ないですもんね…。
例としたサイトは辞書形式で、単語ごとに改行があったから何とかなったのか…。
0281nobodyさん04/02/25 02:25ID:???
>>280
man egrep して、冒頭を 100遍読んでみ。
028228104/02/25 02:28ID:???
あ、すまん、何か勘違いしてた。スルーしてくれ。
028328104/02/25 02:33ID:???
お詫びといってはナンだが、これでどう?
前の [[:space:]]* は余計かも知れないけど。

$ egrep -iw "^[[:space:]]*[a-z]{6,10}[[:space:]]*$" y.txt
028427004/02/25 02:48ID:???
>>283
遅くにスミマセン…調べ調べて、

$ grep "^[a-z0-9./]\{6,10\}" y.txt

これで出来ました…。
本当に出来てるのか、検証していきたいと思います。

$ egrep -iw "^[[:space:]]*[a-z]{6,10}[[:space:]]*$" y.txt

これでも出来ました!まずは…この意味を解読することから勉強して行きたいと思います…。

昨日cygwin入れてみて、初めてgrep使って…頭がパンパンです。・゚・(ノД`)・゚・。
オヤスミナサイ!
028527004/02/25 02:50ID:???
>>284
訂正!

$ grep -iw "^[a-z0-9./]\{6,10\}" y.txt

でした!

|彡サッ
028627004/02/25 03:34ID:???
$ grep "^[a-z0-9./]\{6,10\}" y.txt

$ egrep -iw "^[[:space:]]*[a-z]{6,10}[[:space:]]*$" y.txt

どちらを使っても、y.txtの中の改行をすべて空白に変えてみて、一面単語の海にすると取り出せないですね…。
もう諦めてマジ寝ます。
また明日悩みます。
028728104/02/25 04:30ID:???
>>286
それこそ、man egrep して、冒頭を 100遍読んでみ。

ていうか、grep でそれやるなら、
逆に、空白をすべて改行に変えてみた方が取り出しやすいと思われ。
0288nobodyさん04/02/25 14:02ID:12gYevYJ
PERLで
予約語が行にあったら文字で挟んで置き換えるという処理なんですが

$ReplaceStr = $left . $word . $right;
$line =~ s/(\W)$word(\W)/$1$ReplaceStr$2/g;

だと行頭と行末が正しく置換できないです。どうすればいいんでしょうか?

0289nobodyさん04/02/25 14:32ID:???
s/\b$word\b/$left$word$right/g;
0290nobodyさん04/02/25 17:55ID:12gYevYJ
>>289
ありがとうございます!
こんな便利なキャラクタがあったんですね!
それぞれ予約語の配列にforeachかけてやってたんですが
速度的にはこっちの方が速くなるんでしょうか?

chomp(@ReserveWords);
$MachWords = join("|",@ReserveWords);

foreach $line(@inputlines){
    $line =~ s/\b$MachWords\b/$left$&$right/g;
}
029126604/02/25 20:16ID:v7alvSdo
古い話で申し訳ないっすけど。

>>269
レスどうもっす。

>Perlなら
>$hoge !~ /^mojiretu/g;
>で、文字列以外にヒットするはず

ん〜、申し訳ない、説明不足した。
正規表現で「mojiretu」が無い事にマッチしたいんですよ。
どうでしょう?
0292nobodyさん04/02/25 20:19ID:???
>>291
http://www.din.or.jp/~ohzaki/regex.htm#Without
0293nobodyさん04/02/25 22:58ID:???
!~ はマッチしないものが選ばれるはず。
0294nobodyさん04/02/26 12:30ID:pqrzwzpG
if($FORM{'comment'} =~ /\@/) { &error; }
とした場合、

@が含まれる文が、エラーになるのは
あたりまえなのですが、

病院 という語句までも制限してしまいます。
shift-jisですけど、文字コードとかが関係しているのでしょうか?
0295nobodyさん04/02/26 13:27ID:???
>>294
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
029629404/02/26 13:29ID:???
調べたところ、
「ァ」や「院」は@と認識されてしまうみたいですね・・・
一度、他の文字に変換してから、
元に戻そうと思います・・・
029729404/02/26 13:37ID:???
>>295
ありがとうございます。
勉強します。
0298nobodyさん04/02/26 16:11ID:???
if($word =~ /$search/o){
print $1;
}
という処理をした時に、$search内に正規表現用文字($や^等)が入っていた時
例)
$search = "[abc]"等

に、それを正規表現としてとらえてしまいます。
調べてみたところ、どうやらそれが正しい動作という事でしたが、
この$searchを単なる文字列として見て、例のような文字列の検索を行った時に
「aかbかc」ではなく、「"[abc]"という文字列」として検索するにはどうすれば良いんでしょうか。
0299nobodyさん04/02/26 16:31ID:???
>>298
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html#Regular_Expressions
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq6.html#How_can_I_quote_a_variable_to_us

以後、Perl の質問は http://pc2.2ch.net/test/read.cgi/php/1075545279/ へ。
0300nobodyさん04/02/27 00:44ID:28vfJb2l
どっか勘違いしてるのでしょうか?
perlなのですが、
テキストボックスに入れた数値を$in{'count'}に格納して、
それが数字じゃなければエラー出しして終わりにしたいのですが、
数値だろうと、そうでなかろうと、いかのunlessの中を通りません。

 unless ( ($in{'count'} =~ m/^[1-9][0-9]*$/) || ($in{'count'} == 0) ){
  print "Content-type: text/html\n\n";
  print "数字を入れてください。もどってください。";
  exit;
 }
0301nobodyさん04/02/27 01:04ID:???
>>300
こういうことか?

if ("hoge" == 0) { print "ZERO\n" } else { print "NON-ZERO\n" };
030230004/02/27 01:33ID:???
>>301
えっと、ごめんなさい、正確に言うと、
「正の整数」を入れてもらいたいので、そうでない場合は、エラーではじきたいのですが。。。
「dhfshfhjksad」みたいな適当な文字を入れてもエラーをすり抜けてしまうし、
「345」みたいちゃんとした「正の整数」を入れても、エラーをすり抜けてくれる。。。
0303nobodyさん04/02/27 01:46ID:???
>>300
数字は $in{'count'} =~ m/^[1-9][0-9]*$/ で真になるから unless
ブロックに入らない。(数字を含まない) 文字列を数値コンテキスト
で評価すると 0 になるので $in{'count'} == 0 で真になるから unless
ブロックに入らない。

以後、Perl の質問は http://pc2.2ch.net/test/read.cgi/php/1075545279/ へ。
0304nobodyさん04/02/27 03:08ID:zgPOAYIB
>>292
感謝!

(?:(?!foo).)*
これかぁ〜、なるほど実験しみます。
030530004/02/27 04:09ID:???
>>303

なるほど、よくわかりました。ありがとうございます。
0306nobodyさん04/02/27 21:31ID:???

0307nobodyさん04/02/28 22:17ID:???
<P class="fuga">hoge</P>

こういうタグをいったんサニタイズした文字列

<P class="fuga">hoge</P>

に対して

m/<(P|H[1-6]|ADDRESS|PRE|BLOCKQUOTE|DIV|OL|UL|DL)(| class="\w{1,20}")>(.*)<\/$1>/

こういう感じにマッチさせたいのですが、$1が働かないのはなぜでしょう。
$1に「P」が入ってうまくいくと思うのはマチガイ?
0308nobodyさん04/02/28 22:22ID:???
あ、失敗^-^;
実体参照されちまった。こうです。


&amp;lt;P class=&quot;fuga&quot;&amp;gt;hoge&amp;lt;/P&amp;gt;

m/&amp;lt;(P|H[1-6]|ADDRESS|PRE|BLOCKQUOTE|DIV|OL|UL|DL)(| class=&amp;quot;\w{1,20}&amp;quot;)&amp;gt;(.*)&amp;lt;\/P&amp;gt;/

0309nobodyさん04/02/28 22:25ID:K5IxNsG1
まことにスマン。こんどこそ。

&lt;P class=&quot;fuga&quot;&gt;hoge&lt;/P&gt;

m/&lt;(P|H[1-6]|ADDRESS|PRE|BLOCKQUOTE|DIV|OL|UL|DL)(| class=&quot;\w{1,20}&quot;)&gt;(.*)&lt;\/P&gt;/
0310nobodyさん04/02/28 22:26ID:???
>>307-309
http://www.kt.rim.or.jp/~kbk/regex/regex.html#BACKREF
0311nobodyさん04/02/28 22:32ID:???
>>310
く、なるほど。perlの特殊変数と正規表現を混同していたわけか・・・

ありがとうございました。恥ずかしい失敗ですが、一歩前進。


なんども失敗してスマン。
0312nobodyさん04/02/29 14:20ID:tS63OhT8
PHPで入力された文字がEUCの半角カナのみかチェックしたいです。
整数のみのチェックは正規表現でできました。

^[0-9]+$ 整数のみの正規表現
EUCの半角カナのみの正規表現は?
0313nobodyさん04/02/29 14:29ID:???
そこまでわかってるならヒント

^(ア|イ|ウ|エ|オ)+$
0314nobodyさん04/02/29 15:25ID:???
>>312
EUC の半角カタカナは、SS2 (8E) + JIS X 0201 カタカナ (A1-DF) だから、
こんな感じでいけそうな気がします。
いかがでしょうか。

^(\x8E[\xA1-\xDF])*$
0315nobodyさん04/02/29 17:41ID:???
マルチにレスすんなよ。
PHPスレで聞いてる
0316nobodyさん04/03/01 00:32ID:uvhpNWvz
[email protected]?subject=????
の?以降の件名部分をPHPで削除したいんだけど、

$str= ereg_replace("/?.*/", "" , $str);

では無理だった・・。
これではお話になりませんか?
0317nobodyさん04/03/01 00:56ID:???
?は0文字か1文字を表すメタ文字の予感
031831604/03/01 02:31ID:???
317さんのご指摘の元、色々やって出来た予感。
要らないかもしれないけど、書いときます。

$mail = "[email protected]?subject=件名"
preg_match("/^[\w\-\.]+@[\w\-]+\.[\w\-\.]+/","$mail", $matches);
$mail = $matches[0];

正解かどうかわかりませぬが、これでやっていこうと思います。
0319nobodyさん04/03/01 02:44ID:???
>>318
>>317 が言いたかったのは /\?.*/ と思われ。
まあそれで解決してるならいいんだけどね。
0320nobodyさん04/03/03 11:51ID:???
リモートホストを
1.英数字のピリオド区切り
2.英数字のみ
のいずれかの条件でマッチさせようと思い、
(リモホ) =~ m/^(\w+\.?)+\w+$/
などとやったのですが駄目なようで、これ以上思い浮かびません。
どうすれば良いのでしょう。
0321nobodyさん04/03/03 15:08ID:???
>>320
こうじゃね?
m/^(\w+\.)*\w+$/

もうちょっと仕様どおりちゃんとやるならこう?
m/^(?:[0-9a-z]+\.)*[0-9a-z]+$/i
0322nobodyさん04/03/04 01:43ID:???
ああそうか区切る時は前の方(やや不適切な言い方ですが)の
有無を調べれば良かったんですね。
ありがとうございました。
0323nobodyさん04/03/05 07:43ID:???
$charactorにひらがな(あーん)以外が含まれているかどうか判断したいのですが

if ( $charactor =~/[^あ_ん]/) {
print "あーんを以外含んでいます。\n";
}
というふうにしてみたのですが
上手くいきません
自分では見当がつかないのでアドバイスをください
0324nobodyさん04/03/05 10:53ID:???
>>323
-
0325nobodyさん04/03/05 11:00ID:???
Perlメモによると
># 全角ひらがな [ぁ-ん]
>$Zhiragana = '(?:\xA4[\xA1-\xF3])'; # EUC-JP
>$Zhiragana_sjis = '(?:\x82[\x9F-\xF1])'; # SJIS

なので、EUC-JPならこうかな。つかPerl分からん。
if (!$charactor =~/^(\xA4[\xA1-\xF3])*$/) {
print "ひらがな以外を含んでいます。\n";
}
0326nobodyさん04/03/05 11:53ID:???
>>324
コピペするときに間違えました。
>>325
ありがとうございます!

if ( $charactor =~/[^\x82\x9F-\xF1]/) {
print "あーん以外を含んでいます。\n";
}
これで出来るようになりました。
032732504/03/05 12:00ID:???
>>326
ちょっと待て、それじゃ誤判定しない?
ひらがな以外にマッチではなく、「『文字列がひらがなのみ』にマッチしない」としないと。
if ($charactor !~ /^(?:\x82[\x9F-\xF1])*$/) {
print "ひらがな以外を含んでいます。\n";
}
0328nobodyさん04/03/06 21:48ID:???
>321
ハイフンも使えるから
m/^([\w\-]+\.)*[\w\-]+$/
のような気が。
#ハイフンのエスケープ要るか要らないか忘れたけど
0329nobodyさん04/03/07 22:19ID:???
PHP4で@の読みの「アットマーク」「アトマク」「アツトマァク」「アット」「アツトマアク」らに
マッチする正規表現をお教え下さい。
ア[ッツ]?ト{マ[ーアァ]?ク}? とか アッ?ツ?ト{マ[ーアァ]?ク}? 
初心者なので全然だめです・・。
0330nobodyさん04/03/07 23:11ID:???
上のはメルアドはじきなのでしたけど、
@|@|(あ[っつ]?と).*|(ア[ッツ]?ト).*|(ア[ッツ]?ト).*
でいくことにします。
アットローンでもマッチしちゃうけどいいや・・・・・。
0331nobodyさん04/03/07 23:11ID:???
[アットマーク|アトマク|アツトマァク|アット|アツトマアク]
0332nobodyさん04/03/08 03:41ID:???
ア[ッツ]?ト(マ[ーア]?ク)?
0333nobodyさん04/03/08 05:41ID:???
>332 どうも。
アットローンでもアトムでもマッチしちゃうよね?
^ア[ッツ]?トマ[ーアァ]?ク$     だと「アット」「アト」がマッチしない・・・
「アット」と「アットマーク」にマッチして「アットローン」にマッチしないなんてできないのかなo(~ρ~)o zzz・・・
0334nobodyさん04/03/08 10:05ID:???
>>333
「@ローン」の読みは「アットローン」なんだけど。
マッチしなかったらおかしくないか?@はアットって読んでもいいんだろ?
0335nobodyさん04/03/08 13:19ID:???
PHPで簡単なweb上思いついたスクリプトを書き残すメモ帳のようなものを作成してるんですが
その中で「//〜〜〜\n」や「/* */」などのいわゆるコメントの部分を
色分けして表示したいのですがコメント部分とマッチさせる正規表現がどうしてもわかりません。
「/* */」については/*を<FONT COLOR=RED>/*にし
*/を*/</FONT>にしたのですがこれだと
「""」に囲まれたコメントではない部分も色分けされてしまいます。当たり前ですが・・・。
0336nobodyさん04/03/08 15:37ID:???
>>335
こんなんでいいんじゃないか

<?php
header("Content-Type:text/html; charset=Shift_JIS");

$comment[0] = "\/\/[^\n]*?\n";
$comment[1] = "\/\*(.*?)\*\/";

$msg = "TextTextText // TextText
TextText
TextTextText /* TextText */
TextText
// TextText /* TextText */ Text
Text
";

foreach($comment as $regexp){
$msg = mb_ereg_replace($regexp,"<span style=\"color:red\">\\0</span>",$msg);
}

$msg = nl2br($msg);
echo $msg;
?>
0337nobodyさん04/03/10 21:20ID:???
use Jcode;
$jis=Jcode->new($ARGV[0],'utf8')->jis;
$jis=~s/([^a-zA-Z0-9])/sprintf("%%%02lX",unpack("C",$1))/eg;
$jis=~s/%1B%28B$//; $jis=~s/^%1B%24B//; # <= separate
$jis=~s/%/\\x/g;
こいつで16進にして正規表現かけてんですが

___ファイル内のjisコード文字列____

ああ接続FTP接続うう

__________________________________


FTP接続 <= なら引っかかってくれます

接続FTP <= だと駄目です

  なぜに?
0338未承諾広告※ ◆aiY4htt2.2 04/03/10 21:39ID:???
>>337
テストもせずに s/\G と逝ってみるテスト
033933704/03/10 22:49ID:QeEknFJh
perl FTP接続 <= だとOK
FTP\x1B\x24B\x40\x5CB3

perl 接続 <= これもOK
\x40\x5CB3

perl 接続FTP <= だと駄目でつ
\x40\x5CB3\x1B\x28BFTP

s/\G と逝ってみたいんですがどこで使うんでつか

アホですまそ
0340nobodyさん04/03/11 22:13ID:???
質問させてください。

abc  abc%xyz  123  123%xyz
という4つの文字列があるときに、左から順番に、

$1 に 'abc' が代入されるようにマッチする
マッチしない
$1 に '123' が代入されるようにマッチする
$1 に '123'、 $2 に 'xyz' が代入されるようにマッチする

にはどう書けばよいでしょうか?

/^(?:(abc)|(123)(?:%(xyz))?)$/
だと、3つ目と4つ目の '123' が $2 に入る

/^(abc|123)(?:%(xyz))?$/
だと、2つ目がマッチする

/^(abc|123(?:%(xyz))?)$/
だと、4つ目の $1 に文字列すべてが入る

みたいな感じでだめでした。
わかりにくい上に低レベルな質問で
申し訳ないですがよろしくお願いします。
0341nobodyさん04/03/11 22:40ID:???
>>340
/^(\w+)(?:$|(?<![A-Za-z])%(\w+)$)/
034234004/03/11 23:05ID:???
>>341
ありがとうございました。完璧です。
こういうときに Positive Lookbehind Assertion 使うんですね。
ぜんぜん思いつきませんでした orz
0343nobodyさん04/03/22 16:58ID:JNc4vCtR
if( !reply_to || reply_to.search(/\d/) )

JavaScriptでの分岐条件ですが、
「reply_toがないか、あるいはあっても数字以外の文字が含まれている場合はtrue」
という条件式です。
上記でどうもうまく行っているのですが解せません。
数字以外の文字って「\D」ですよね。何か勘違いしていますか?

perl/CGI+JavaScriptで製作中ですが正規表現はあまりやった事ないです。
あるいは上記条件式だとどう書くのが普通ですか?
0344nobodyさん04/03/22 17:03ID:???
>>343
Web制作板で聞けよ

if (inNan(reply_to)) でどうだ?
0345nobodyさん04/03/22 17:04ID:???
if (inNaN(reply_to)) だった
0346nobodyさん04/03/22 17:54ID:???
>>345
> if (inNaN(reply_to)) だった
isNaN(reply_to)でした。
こんなんがあるんですね。
勉強になりました。
0347nobodyさん04/03/22 18:05ID:???
isNaN で良いの? isNaN("123foo") とかも false になるよ。

あと、aString.search(aRegExp) は、「マッチした位置」を返すので、
たぶん >>343 のはうまくいっていないと思われ。
マッチしないときには -1 を返すので、
if ( !reply_to || reply_to.search(/\D/) >= 0 )
とかじゃないかな?
0348nobodyさん04/03/22 18:21ID:???
>>347
falseになるわけねぇだろうが
034934304/03/22 18:24ID:???
>>347
> isNaN で良いの? isNaN("123foo") とかも false になるよ。

えーと、今回は数字以外の文字が含まれてたら false でオッケイです。
>
> あと、aString.search(aRegExp) は、「マッチした位置」を返すので、
> たぶん >>343 のはうまくいっていないと思われ。
> マッチしないときには -1 を返すので、
> if ( !reply_to || reply_to.search(/\D/) >= 0 )
> とかじゃないかな?

なるほど、、、微妙に返り値が違うんですね。
単純にブール値を返すもんだと思ってました。
勉強になりました。
クライアントサイドJavaScriptってうまく組み込むと便利ですけど、
ブラウザ依存だったりバージョン互換性の問題とか、結構微妙ですね。
いえ、今回の件とは関係ないですけど。
ありがとうございました。
035034304/03/22 18:26ID:???
>>348
> >>347
> falseになるわけねぇだろうが
ああ、そうですね。数字かどうかですからね。
trueでいいんです。
たぶんうっかりミスですね。御指摘どうも。
0351nobodyさん04/03/22 18:41ID:???
>>348
げ、処理系依存なのか。確かに IE だとならないね。
でも、 isNaN("1e0") とかは false になるよね?
0352nobodyさん04/03/29 21:33ID:???
復帰
0353nobodyさん04/04/08 15:03ID:AQ8qwK3r
"abcdeあいうえお\"fghijかきくけこ";

のようなダブルクォートで囲まれた文字列を取得したいのですが、
文字列に\"を含んでいる場合うまく取得できません。

"[^"]*"と書いているので当然と言えば当然なのですが・・・
どのようにしたら、\"を含む文字列をうまく取得できますでしょうか?
0354nobodyさん04/04/08 15:38ID:???
余計なことをせずに最長マッチさせればいいんじゃないの。
/"(.*)"/
こういうのもありかもしれないけど。
/"((?<=\\").*)"/
■ このスレッドは過去ログ倉庫に格納されています