トップページ⇒php
981コメント301KB

正規表現道場@2ch Part4

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

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

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/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/
0591nobodyさん2005/08/03(水) 00:44:23ID:???
>>590
ありがとうございます。Googleで、調べまくっても判らないんです。
なにとぞお願いします・・・<(_ _)>
0592nobodyさん2005/08/03(水) 03:02:28ID:???
つ「preg_match」
05935892005/08/03(水) 06:12:36ID:???
>>592
if ( preg_match("(\\d+)\.(\\d+)\.(\\d+)\.(\\d+)", $str) ) { 
で良いんですか?しかし、IPと判定されません。
正規表現の部分が間違ってるんでしょうか?



0594nobodyさん2005/08/03(水) 12:31:12ID:???
まず ereg の場合、 POSIX regex に \d は無いので、[0-9] か [[:digit:]] を使う。
あと、ダブルクオート文字列内のバックスラッシュのエスケープには注意。 \. とか。
preg_match の場合は正規表現の記述が独特だね。

ereg("([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+)", $str)
ereg("([[:digit:]]+)\\.([[:digit:]]+)\\.([[:digit:]]+)\\.([[:digit:]]+)", $str)
preg_match("/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)/", $str)
0595nobodyさん2005/08/03(水) 13:38:00ID:???
一所懸命頑張ってるところアレなんだが、任意の文字列について
IPアドレスかどうか判定するってのに正規表現は適任じゃないだろ。

>>594の例だと123456.123456.987654.987654なんかでもマッチしちゃうけど、
これはIPアドレスではないよな?

「.」でsplitした結果の配列の要素数は4か?各要素は全て数字で、0〜255の範囲内か?
とか、そういうことじゃん?

いや、規格とか詳しくないので、それで十分なのかどうか断言できないけど、
少なくともpreg_matchひとつで判定できるような代物じゃないと思うわけよ。
0596nobodyさん2005/08/03(水) 18:18:24ID:M5PNKcG2
preg_match("/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/", $str)
0597nobodyさん2005/08/03(水) 21:16:48ID:???
>>596
無理矢理だな。。。
普通に大小比較して0〜255内かとやった方が良い気が…。
0598nobodyさん2005/08/03(水) 21:19:26ID:???
>>596
あー それどっかの技師がjavaでそうやってたな…
0599nobodyさん2005/08/03(水) 21:25:53ID:M5PNKcG2
>>597
無理矢理だろうが何だろうが、preg_matchひとつで判定できるような代物ですが何か?
0600nobodyさん2005/08/03(水) 21:43:01ID:???
つ is_ipaddress()
0601nobodyさん2005/08/12(金) 05:18:07ID:???
リネーム用の正規表現を作って欲しいのですが、

フラッシュ[1].jepg
フラッシュ[10].jepg
フラッシュ[100].jepg
フラッシュ[2].jepg
↓
フラッシュ[0001].jepg
フラッシュ[0010].jepg
フラッシュ[0100].jepg
フラッシュ[0002].jepg

こう言う正規表現を誰かお願いします。
0602nobodyさん2005/08/12(金) 05:51:20ID:???
>>601
宿題は自分でやろうな。
0603nobodyさん2005/08/12(金) 11:04:52ID:???
/usr/local/aiueoというディレクトリがあった場合、"/usr/local/aiueo"じゃないディレクトリにマッチするという
正規表現を教えて下さい。(/usr/local/abcde にはマッチするが、/usr/local/aiueoはマッチしない)
apacheの設定で必要なんですが今一分からない、、、orz
0604nobodyさん2005/08/12(金) 11:27:06ID:???
事故解決
/usr/local/(?!aiueo)
でいいのか・・・間違ってたら教えて下さい
0605nobodyさん2005/08/12(金) 15:18:28ID:???
>>602
宿題じゃないです。
学校にも通ってません。
ソフトを教えてもらうスレでソフトは手に入れたのですが、
正規表現を使わないといけないみたいなんです。
断じて宿題ではありません。
0606nobodyさん2005/08/12(金) 15:21:57ID:???
>>601
nameryというソフトを使うといいよ。
0607nobodyさん2005/08/12(金) 15:27:19ID:???
* 文字列をマッチするところまでは正規表現の責務だけど、
その先のマッチした文字列を書き換えるところは正規表現の責務じゃない。
* そして、書き換えるところの仕様はソフトによってまちまちなので、
ソフト名を示さないと答えようがない。
* さらに、正規表現もソフトによって異なる点が少なくないので、
ソフト名を示さないと答えようがないケースも多い。
0608nobodyさん2005/08/12(金) 15:56:19ID:???
ほんと>>1の4行目だけでも読んでほしい。
0609nobodyさん2005/08/12(金) 16:57:29ID:???
>>606
ベクターで探してみます。

>>607
あっちで教えてもらったソフトは、regrenと言うソフトでした。
ttp://magarchive.halfmoon.jp/nifty/softs/regren.html

>>608
すみません。
0610nobodyさん2005/08/13(土) 10:23:33ID:???
すいません、きっと物凄く初歩的な質問なんだと思いますが、
これがマッチしないのはどうしてなんでしょう?お助け下さい。

$ua = "Opera 8.01 [ja]";
preg_match("/Opera 8\.01 \[ja\]/i", $ua)
06116102005/08/13(土) 10:36:32ID:???
自己解凍しました。OperaのUAは"Opera 8.01__[ja]"と
スペースをふたつ吐いてました。        ↑
0612nobodyさん2005/08/28(日) 20:15:48ID:???
http://age.example.net/0a1b2c3d4e-5f6g7h8i9j
https://age.example.net/9j8i7h6g5f-4e3d2c1b0a?ref=true
http://sage.example.net/a1b2c3d4e5-f6g7h8i9j0
https://age.example.net/0j1i2h3g4f-5e6d7c8b9a

上記のようなURLを抽出したいと思い、下記のように試してみましたが

preg_match_all(
"/(https?:\/\/s?age\.example\.net\/[a-z0-9]{10}+-[a-z0-9]{10}+(\?ref=true)?)/i",
$str, $val);

http://sage.example.net/a1b2c3d4e5-f6g7h8i9j0 というような
sageではじまるURLが取得できません

どこがおかしいのでしょうか?ご教授お願いします
06136122005/08/28(日) 20:23:16ID:???
すみません、ageるのを忘れていました
0614nobodyさん2005/08/28(日) 20:26:13ID:???
preg_match_all( "/(<a href=\".\/)(.*)(<\/a>)/i", $str, $val);

これじゃだめなの?
06156122005/08/28(日) 21:12:17ID:???
>>614
説明不足で申し訳ありません
a要素は勿論、HTMLタグ自体含まれないテキストファイルから抽出したいのです
0616nobodyさん2005/08/28(日) 21:36:14ID:???
/s?age\.を/s\?age\.こうしたら?
0617nobodyさん2005/08/28(日) 21:45:11ID:???
+が不要。取りなよ。
06186172005/08/28(日) 21:47:13ID:???
量指定子は {10} があるでしょ。+は要らない。
ほんとに10桁なら、それでOK。
0619nobodyさん2005/08/28(日) 23:07:24ID:???
>>616-618
ありがとうございます
sageではじまるURLの件を除いて、期待通りの動作が確認できました

未熟なので好ましくないコーディングをしている部分がありますが
日々精進していきたいと思います
0620nobodyさん2005/08/28(日) 23:59:00ID:???
sageではじまるURLの件ですが、sageではじまる場合、hostの部分も微妙に1文字
異なるというのが原因でした
皆様本当にお騒がせしました・・・
0621nobodyさん2005/08/31(水) 08:41:15ID:Ym1OpgcO
VBScriptのRegExpなんですが、メールアドレスを表す正規表現が
[\w\.-]+(\+[\w-]*)?@([\w-]+\.)+[\w-]+
と手元の本に書いてありました。
でもこれの意味がよく分かりません。
どなたか解読していただけないでしょうか?

あと上のメールアドレスの正規表現に
!#$%&`+-'^{}
の文字も使えるようにするにはどうすればいいんでしょうか?

よろしくお願いします。。。
0622nobodyさん2005/08/31(水) 17:56:05ID:???
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                     .|
       ____.____    |
     |        |        |   |
     |        | ∧_∧ |   |
     |        |( ´∀`)つ ミ |
     |        |/ ⊃  ノ |   | 手元のクソ本
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |
0623nobodyさん2005/09/05(月) 02:14:46ID:???
すみません、質問させて下さい。
javascriptで 通常のdatを かちゅ〜しゃdatに変換するコンバータを作っています。
http://www.geocities.jp/mirrorhenkan/katu/
ある程度出来たのですが、2点ほどつまづいています

「&gt;1-2」などがマッチした場合は
「<a href="http://hoge.com?bbs=hoge&st=1&to=2">&gt;1-2</a>」
と置換したいので

<script>
test = "これ&gt;1-2です そして&gt;10-20です あと&gt;200-300も";
test = test.replace(/(&gt;)(\d+)(-)(\d+)/g,"<a href=\"http:\/\/hoge.com?bbs=hoge&st=$2&to=$4\">$1$2$3$4</a>");
document.write(test);
</script>

という正規表現をjavascriptで組んでみたら
ちゃんと動作するのですが、
http://www.geocities.jp/mirrorhenkan/katu/
で同じようにやると、
数字が一桁づつの時は動作するのですが
「&gt;99-100」とか「&gt;100-200」等の時には
それぞれ
「〜st=9&to=9">&gt;9</a>9-100」
「〜st=10&to=10">&gt;10</a>0-200」
のようになってしまいます。
もし宜しければ正規表現のおかしい箇所を御指導頂けないでしょうか。
上記ページの該当部分はこちら↓です

line[3] = line[3].replace(/([^>\;]|^)(&gt;|&gt;&gt;|>|>>|≫)(\d+)(-)(\d+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");

$3と$5に数字が格納され、URL部分は「sp1+"$3"+sp2+"$5"+sp3」になります。
0624nobodyさん2005/09/05(月) 02:25:13ID:???
蛇足です
クライアントサイドのスクリプト(javascript)を使ってはいますが
正規表現の問題だろうと思い こちらに投稿しました。

あと
最初、間違えて(と書いたら失礼ですが)プログラム板の正規表現スレに
質問したのですが、反応がないので改めてこちらでお願いさせて頂きたく思います。

お詫びという訳でもありませんが、正規表現スレの過去ログです(IEと専用ブラウザ限定ですが)

0625nobodyさん2005/09/05(月) 02:27:39ID:???
貼り忘れてました

http://www.geocities.jp/mirrorhenkan/dat2html-3/
0626nobodyさん2005/09/05(月) 17:18:48ID:???
「xxx1x (17)」とあって17だけ取得するにはどうしたらいいのですか?
/[^\d]/で行けると思ったのですが117となってしまいました。

宜しくお願いします。
0627nobodyさん2005/09/05(月) 17:21:09ID:???
正規表現だけ覚えても役に立たない?
何だか楽しそうだから勉強してみたいんだが。
0628nobodyさん2005/09/05(月) 18:13:16ID:???
>>626
\((\d+)\)
Perlだと s/[^\d]//g; なんて置換しない限り117にはならない。

>>627
正規表現環境が用意されているエディタやファイラでも大体そのまま使えるよ。
0629nobodyさん2005/09/05(月) 19:58:08ID:???
>>623
その「該当部分」がおかしいわけではなくて、一連の replace() うちで、
一番最初のに先にマッチしてしまっているのがまずいんじゃないかな。

ちょっとまだ考え切れてないけど、 replace() を並べる順番を逆にして、
一番複雑なパターンからマッチを試行していくようにするとか、
あるいは、頑張って正規表現を一つにまとめて一度で replace するようにするとか。

>>627
何だか楽しそうだから始めるっていうのは動機として全然アリなんじゃないかと。
06306232005/09/06(火) 20:37:04ID:???
replaceを並べる順番を逆にしてみたら、望む結果が得られるようになりました。
何でそうなったのか、後でじっくり考えてみようと思います。
>>629さん、ありがとうございます。

もう一つ質問してもいいでしょうか。

「&gt;1」や「&gt;50」等のように
レス番に全角数字を使っている場合、
URL該当部分だけ半角数字にする正規表現は何か考えられるでしょうか。

例えば
<script>
test = "これ&gt;1-2です";
test = test.replace(/(&gt;)(\d+)(-)(\d+)/g,"<a href=\"http:\/\/hoge.com?bbs=hoge&st=$2&to=$4\">$1$2$3$4</a>");
document.write(test);
</script>

の場合、
「これ<a href="http://hoge.com?bbs=hoge&st=1&to=2">&gt;1-2</a>です」
と表示されますが、
URL表示部分の数字を半角にしたいのです。


javascript寄りの質問になってしまっていたら、申し訳ありません。
もし宜しかったらお願い致します。
0631nobodyさん2005/09/06(火) 23:15:05ID:???
>>630
\dが全角数字にもマッチするってどのブラウザ?
WinIE6では再現できなかった。[0-9]ならできたけど。

とりあえず全角数字部分をescapeして
"0"→"%uFF10"→"0"
"9"→"%uFF19"→"9"
みたいに末尾1字取れば一応半角に戻る
"630".replace(/0/g,'0').replace(/1/g,'1').replace(/2/g,'2').replace(/3/g,'3').......
でもいいけど。他にもっといい方法あるかも。

url = "http://hoge.com?bbs=hoge&st=1&to=2";
url = url.replace(/([0-9])/g, function(){return escape(arguments[1]).substr(5)}));
// 参考:JavaScript質問スレ40-237
0632nobodyさん2005/09/07(水) 00:29:44ID:CuTS4a6v
質問です。Perlで、
(foo)(bar)(hoge)
のような文字列のときに、それぞれの括弧とその中身にマッチさせるにはどうすればいいでしょうか。
どうしても一番外側の括弧一つだけしかマッチできません。
0633nobodyさん2005/09/07(水) 00:38:23ID:???
>>632
*?
0634nobodyさん2005/09/07(水) 00:40:32ID:???
>>633
こ、こんな簡単にできるとは……恥ずかしい……
ありがとうございます。
0635nobodyさん2005/09/07(水) 05:01:10ID:???
>>628
�dくす。
0636nobodyさん2005/09/07(水) 05:59:43ID:L++YBOi9
既出だと思うが

とりあえず次スレのテンプレには
/\Qhttp://pc8.2ch.net/php/index.html\E/
m|usr/local/bin/perl|

が必要だと感じた。
06376232005/09/07(水) 19:44:49ID:???
>>631
すみません、ごちゃごちゃしてて書き換え忘れてました。[0-9]です。

escapeを教えて頂いてありがとうございます。
ただ、URL部分だけを半角数字にするにはどういう方法があるのだろう・・。

例えば
<script>
url = "1番目のレスは<a href=\"http://hoge.com?bbs=hoge&key=0123456789&st=551&to=552\">&gt;551-552</a>です";
url = url.replace(/([0-9])/g, function(){return escape(arguments[1]).substr(5)});
document.write(url);
</script>

とやると、URL以外の数字も半角になってしまいます・・。
06386232005/09/07(水) 19:51:37ID:???
それと、レスアンカーを連続させたものを変換させると
アンカーが飛び飛びについてしまいます

<script>
line = "&gt;2 &gt;3 &gt;4 &gt;5 &gt;6 &gt;7-8 &gt;90-100 >100-200";
sp1 = "<a href=\"http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st=";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
//半角レス番
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)(\d+)(-)(\d+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)(\d+)([^<-]|$)/g,"$1"+sp1+"$3"+sp2+"$3"+sp3+"$2$3<\/a>$4");
//全角レス番
line = line.replace(/([^>\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-9]+)(-|\−|\ー)([0-9]+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
line = line.replace(/([^>\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-9]+)([^<-]|$)/g,"$1"+sp1+"$3"+sp2+"$3"+sp3+"$2$3<\/a>$4");
document.write(line);
</script>

実行させると
レスアンカーが一つ飛びについてない状態です
何故だ・・・
0639nobodyさん2005/09/08(木) 15:49:43ID:???
>>638
半角レス番と全角レス番分けないで一回で置換しないと。
0640nobodyさん2005/09/08(木) 15:58:55ID:???
<script>
line = ">2 >3 >4 >5 >6 >7-8 >90-100 >100-200";
sp1 = "<a href=\"http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st=";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
line = line.replace(/(>|>>|>|>>|≫)([0-90-9]+)(-([0-90-9]+))?/g, ""+sp1+"$2"+sp2+"$4"+sp3+"$1$2$3<\/a>");
document.write(line);
</script>

これでいいのかな?
まだハイパーリンクに仕込む番号は半角化しないとならないな。
0641nobodyさん2005/09/08(木) 16:35:13ID:???
アンカー開始記号は (>|>>|>|>>|≫) じゃなくて
(>>|>|>>|>|≫) みたいにして長い方のパターンを先にしなきゃダメじゃない?
0642nobodyさん2005/09/08(木) 16:47:57ID:???
>>641
順番は関係ない。
どうせ非決定性オートマトンになった時、同じ状態からヒモが伸びるだけ。
0643nobodyさん2005/09/08(木) 17:07:45ID:???
あ、なんか変な勘違いしてた。スレ汚しスマソ。
0644nobodyさん2005/09/08(木) 17:08:37ID:???
あ、念のため。 >>641 = >>643 ね。
06456232005/09/08(木) 20:11:30ID:???
>>639-640
半角全角の数字をまとめて出来るとは知りませんでした・・

ただ
「&gt;1」のようにレス番が単独のものと
「&gt;1-2」のようにレス番がまたがるものがあるので
それを一度に置換させる方法があるでしょうか。。

「&gt;1」の場合 →「〜&st=1&to=1〜」
「&gt;1-2」の場合→「〜&st=1&to=2〜」
と、「to=××」の部分に入れる部分が異なるので
今のところは二つに分けているのですが・・・。

全角数字と半角数字をまとめてみました↓が、やはりアンカー飛び飛びだ・・・

<script>
line = "&gt;2 &gt;3 &gt;4 &gt;5 &gt;6 &gt;7-8 &gt;90-100 >100-200";
sp1 = "<a href=\"http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st=";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";

line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)(-|−|ー)([0-90-9]+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)([^<-]|$)/g,"$1"+sp1+"$3"+sp2+"$3"+sp3+"$2$3<\/a>$4");
document.write(line);
</script>

>>640さんのように、正規表現を一つにまとめないと駄目みたいですね。。
0646nobodyさん2005/09/08(木) 20:27:23ID:???
だから([0-90-9]+)(-([0-90-9]+))?の?は、
後半があれば必ず長い方に一致させるから
心配しなくていい。

前後の([^\;]|^)や([^<-]|$)が、lineに格納されたスペースを食っちゃってる
ようだけど。
06476462005/09/08(木) 20:32:18ID:???
あ、そうかto=にも同じ番号入れるんですね。
間違えた。
0648nobodyさん2005/09/08(木) 20:38:19ID:???
>>646 も指摘しているけど、前後のパターンは要らないと思う。何でそれ付けてるの?
0649nobodyさん2005/09/08(木) 20:41:11ID:???
document.write("<xmp>");
document.write(line);
としてみたらやっと気付いたけど、今のままでも
2回目の置換では<a href="...">2</a>とかタグの終了の>
置換してるのが原因だな・・・
0650nobodyさん2005/09/08(木) 20:44:19ID:???
<script>
line = ">2 >3 >4 >5 >6 >7-8 >90-100 >100-200";
sp1 = "<a href=\"http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st=";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";

line = line.replace(/(>|>>|>|>>|≫)([0-90-9]+)(-([0-90-9]+))?/g,
sp1 + "$2" + sp2
+ ("$4" ? "$2" : "$4")
+ sp3 + "$1$2$3<\/a>");

document.write(line);
</script>

ではこれでどう?
06516502005/09/08(木) 20:47:45ID:???
間違った。だめだorz
06526232005/09/09(金) 19:15:40ID:???
よく考えたらレス番数字の正規表現はこのままだと
「>132」等の全角半角混じりでもあてはまってしまうので
([0-9]+|[0-9]+)
でした。。

>>646
>>648
2chの生datをかちゅ〜しゃdatに変換しようとしているのですが
生datを見てみると、レスアンカーは
例えば「&gt;&gt;1」だと
「<a href="../test/read.cgi/server/0123456789/1" target="_blank">&gt;&gt;1</a>」
となっているので、それらを除外させる為に前後につけています。
その正規表現も正しいのかどうか・・。


あと すみません、>>640さんや>>650さんのものだと
例えば「>90-100」だと
「〜&st=90&to=90&nofirst=true〜」となってしまうのです
望む結果は「〜&st=90&to=100&〜」なのです・・

何だか駄々をこねてるみたいで申し訳ないです・・。
06536502005/09/09(金) 20:44:02ID:???
うまくいかない物を貼ってすいません。
今度は大丈夫だと思います。

<script>
line = "&gt;2 &gt;3 &gt;4 &gt;5 &gt;6 &gt;7-8 &gt;90-100 >100-200";
sp1 = "<a href=\"http://server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st=";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";

function toascii(s) {
dest = "";
for (i = 0; i < s.length; i++) {
ch = s.charCodeAt(i);
06546502005/09/09(金) 20:45:42ID:???
if (ch >= 0xff10 && ch <= 0xff19)
dest += String.fromCharCode(ch - 0xff10 + 0x30);
else
dest += s.charAt(i);
}
return dest;
}
function replacefunc(m) {
if (m.match(/(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)([-−ー]([0-90-9]+))/)) {
return m.replace(/(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)([-−ー]([0-90-9]+))/,
sp1 + "$2" + sp2 + "$4" + sp3 + "$1$2$3<\/a>"
).replace(/(st|to)=[0-90-9]+/g, toascii);
} else {
return m.replace(/(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)/,
sp1 + "$2" + sp2 + "$2" + sp3 + "$1$2<\/a>"
).replace(/(st|to)=[0-90-9]+/g, toascii);
}
}

line = line.replace(/(&gt;|&gt;&gt;|>|>>|≫)([0-9]+|[0-9]+)([-−ー][0-90-9]+)?/g,
replacefunc);

document.write(line);
</script>
06556512005/09/10(土) 11:01:20ID:maA6hdJk
preg_match("/^(x83[\x40-\x96]|\x81\x40|\x81\x5B)+$/", $nnn )
PHPで全角カタカナとハイフンと全角スペースだけを通したいんだけどこれ間違えてる?
06566232005/09/10(土) 19:09:02ID:???
>>653-654の>>650さん
すみません、後でじっくりやってみます・・・。
正規表現の内部(?)でも javascript使えるんですね。
0657名無しさん@そうだ選挙に行こう2005/09/10(土) 19:19:19ID:???
>>655
preg_match("/^(\x83[\x40-\x96]|\x81\x40|\x81\\x5B)+$/", $nnn )
にしたら動いた。
\x5bは'['に当たるからエスケープしないとダメ
0658名無しさん@そうだ選挙に行こう2005/09/11(日) 19:40:59ID:???
html-lintって正規表現の塊?
0659名無しさん@そうだ選挙に行こう2005/09/11(日) 22:35:06ID:???
公開してるからソース読んでみろ
0660nobodyさん2005/09/14(水) 09:43:56ID:krHmg2tG
詳説正規表現って何処に売ってるの?
近くの本屋になかった。
0661nobodyさん2005/09/14(水) 09:47:46ID:???
新宿の紀伊国屋なら売ってそうだけど。
立ち読みする必要ないなら通販で買えば。
0662nobodyさん2005/09/15(木) 00:14:36ID:???
オライリーの本置いてある書店は
そこそこでかいとこか、技術書みたいな本が置いてあるようなとこくらい。

オライリーが置いてあるとこでも、全部置いてあるわけじゃないから
>>661の言うように中身確認する必要がなければ通販で買っちゃうのが手っ取り早いかも。

紀伊国屋とかならネットで在庫確認出来るから、利用するのもアリ。
0663nobodyさん2005/09/15(木) 00:17:41ID:???
ヨドバシとかビックでも買えるね。
0664nobodyさん2005/09/15(木) 00:45:18ID:???
ジュンクを忘れていませんか
0665nobodyさん2005/09/15(木) 04:31:19ID:???
大学生協行けよ。
0666nobodyさん2005/09/15(木) 13:19:06ID:???
まあまずはおめーはどこに住んでんだっつー話だな。「近くの」じゃ何とも言えんし。
0667nobodyさん2005/09/15(木) 13:30:10ID:???
660さんにげてー
0668nobodyさん2005/09/15(木) 21:28:10ID:???
Perlにて、正規表現によるマッチングを使おうとして、


$temp[7] =~ /(*.)時(*.)分/;

と使うと、以下のようなメッセージが出ます。

Quantifier follows nothing in regex; marked by <--HERE in m/(* <--HERE .)時(*.)分/; at sub2.pl line 161.

初めてでるエラーメッセージなので憶測ですが、HEREで示されたメタ文字[*]が、掛け算の演算子と間違えて認識されているのでしょうか?
文字コードはShift_JIS、開業コードはCR+LFです。ぜひアドバイスお願いします。。。
0669nobodyさん2005/09/15(木) 21:44:26ID:???
.*
0670nobodyさん2005/09/15(木) 21:53:15ID:???
>>669
ぐおおおおお、本当ですね…
こんな簡単なことでスレ汚してすいません… 回線切ってこのプログラム仕上げてから首吊ってきます…
0671nobodyさん2005/09/15(木) 21:59:21ID:???
翻訳サイトの使い方くらいは知っとこうね。
0672nobodyさん2005/09/16(金) 17:59:17ID:???
>>661-667
ありがとう!
熊谷で売ってなくて、大宮のそごうでも売ってなくて、結局新宿の紀伊国屋まで行ってきたよ。
半端じゃない数だな…。
0673nobodyさん2005/09/16(金) 18:01:35ID:???
何が半端じゃない数なの?
0674nobodyさん2005/09/16(金) 18:46:00ID:???
>>673
本の数。
0675nobodyさん2005/09/16(金) 19:00:48ID:???
ああなるほど。


ところで、最近正規表現の入門的な書籍がたくさん出てきてるみたいだけど、
プログラミングや正規表現の初心者向けに一冊すすめるとしたらコレ、
っていうのは何かある?
0676nobodyさん2005/09/17(土) 15:02:40ID:???
詳説くらいの内容を必要としないなら、ネットの解説サイトの類で事足りる気がしなくもない
0677nobodyさん2005/09/18(日) 21:21:10ID:???
PHPで正規表現を使った置換について質問です。
3以上の数字が、特定の文字列(Xとする)の後に来た場合にマッチさせ置換します。
数字は全角でも半角でもマッチとし、マッチした部分を\\1後で使います。
数字は二桁までを範囲とします。

$pattern = "/X([0-9]?[3-9]|[0-9]?[3-9])/";
preg_replace ("$pattern", "X<span class=\"level\">$1</span>", $aaaa);


これだとうまくマッチしないのですが、何が原因でしょうか。
0678nobodyさん2005/09/18(日) 23:33:12ID:???
10以上で一の位が0〜2になってる数がヒットしないよなそれ。
0679nobodyさん2005/09/19(月) 01:36:01ID:???
(?:[1-9][0-9]|0?[3-9]) とかじゃねー?
0680nobodyさん2005/09/19(月) 16:33:59ID:???
>>671
数量詞はregexで何にも続きません; --<によってマークされて、m/(*<--HERE。)時(*)分/のHERE; sub2.plに、161を裏打ちしてください。
0681nobodyさん2005/09/19(月) 16:54:25ID:???
なんか、php で正規表現ほげる場合って、二重に囲まんといかんから面倒だな。
"/^fuckyou$/"
0682nobodyさん2005/09/19(月) 17:38:25ID:???
シングルクォートで囲むと少しはマシになるよ
0683nobodyさん2005/09/19(月) 17:50:19ID:???
少しはとは?

表現のなかに ' やら " が出て来た場合面倒杉。
0684nobodyさん2005/09/19(月) 18:50:05ID:XLGKZohV
↓こんな風に、適当な文字列の『』で囲まれた部分に特定の文字(この場合“か”とする)を
含まれたものをヒットさせたいのだが、うまくいかない。
$line =~ /『.*?か.*?』/g;
だと、例2のような間に』と『あるやつも引っかかってしまうのだが・・・・・・・わかる人お願い。

例1 $line = "あいうえお『かき』くけこさし『すせ』そ";  →○
例2 $line = "あい『うえお』かき『くけ』こさしすせそ";  →×
0685nobodyさん2005/09/19(月) 18:54:01ID:???
/『.*?か[^『]*?』/
0686nobodyさん2005/09/19(月) 20:17:57ID:???
>>685
はや。
ありがと。
0687nobodyさん2005/09/19(月) 21:28:53ID:???
>>683
"で囲むと、$とかもエスケープしなきゃいかんでしょ。その分が少し。
0688nobodyさん2005/09/19(月) 21:40:28ID:???
>>677
こういうのよく見るけど、
$pattern を用意して、preg_replace() かける時に
わざわざ再度ダブルクォートで囲うのって
個人的にはちょっと…怖いかも。
副作用がありそうで。
0689nobodyさん2005/09/20(火) 23:16:09ID:???
Javaで、文字列をスペース区切りで分割
ただし、"で囲まれた文字列はスペースで分割しない
ということをやりたいんだけど、これって正規表現で
うまくできる?
例:
dir "c:\abc def" ghi jkl

dir
c:\abc def
ghi
jkl

こんな感じに分割したいです。
0690nobodyさん2005/09/20(火) 23:38:25ID:pDhdrwjA
できません。
■ このスレッドは過去ログ倉庫に格納されています