5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

正規表現道場@2ch Part4

623 :nobodyさん:2005/09/05(月) 02:14:46 ID:???
すみません、質問させて下さい。
javascriptで 通常のdatを かちゅ〜しゃdatに変換するコンバータを作っています。
http://www.geocities.jp/mirrorhenkan/katu/
ある程度出来たのですが、2点ほどつまづいています

「>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」になります。

624 :nobodyさん:2005/09/05(月) 02:25:13 ID:???
蛇足です
クライアントサイドのスクリプト(javascript)を使ってはいますが
正規表現の問題だろうと思い こちらに投稿しました。

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

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



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

http://www.geocities.jp/mirrorhenkan/dat2html-3/

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

宜しくお願いします。

627 :nobodyさん:2005/09/05(月) 17:21:09 ID:???
正規表現だけ覚えても役に立たない?
何だか楽しそうだから勉強してみたいんだが。

628 :nobodyさん:2005/09/05(月) 18:13:16 ID:???
>>626
\((\d+)\)
Perlだと s/[^\d]//g; なんて置換しない限り117にはならない。

>>627
正規表現環境が用意されているエディタやファイラでも大体そのまま使えるよ。

629 :nobodyさん:2005/09/05(月) 19:58:08 ID:???
>>623
その「該当部分」がおかしいわけではなくて、一連の replace() うちで、
一番最初のに先にマッチしてしまっているのがまずいんじゃないかな。

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

>>627
何だか楽しそうだから始めるっていうのは動機として全然アリなんじゃないかと。

630 :623:2005/09/06(火) 20:37:04 ID:???
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寄りの質問になってしまっていたら、申し訳ありません。
もし宜しかったらお願い致します。


631 :nobodyさん:2005/09/06(火) 23:15:05 ID:???
>>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

632 :nobodyさん:2005/09/07(水) 00:29:44 ID:CuTS4a6v
質問です。Perlで、
(foo)(bar)(hoge)
のような文字列のときに、それぞれの括弧とその中身にマッチさせるにはどうすればいいでしょうか。
どうしても一番外側の括弧一つだけしかマッチできません。


633 :nobodyさん:2005/09/07(水) 00:38:23 ID:???
>>632
*?

634 :nobodyさん:2005/09/07(水) 00:40:32 ID:???
>>633
こ、こんな簡単にできるとは……恥ずかしい……
ありがとうございます。

635 :nobodyさん:2005/09/07(水) 05:01:10 ID:???
>>628
dくす。

636 :nobodyさん:2005/09/07(水) 05:59:43 ID:L++YBOi9
既出だと思うが

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

が必要だと感じた。

637 :623:2005/09/07(水) 19:44:49 ID:???
>>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以外の数字も半角になってしまいます・・。

638 :623:2005/09/07(水) 19:51:37 ID:???
それと、レスアンカーを連続させたものを変換させると
アンカーが飛び飛びについてしまいます

<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>

実行させると
レスアンカーが一つ飛びについてない状態です
何故だ・・・

639 :nobodyさん:2005/09/08(木) 15:49:43 ID:???
>>638
半角レス番と全角レス番分けないで一回で置換しないと。


640 :nobodyさん:2005/09/08(木) 15:58:55 ID:???
<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>

これでいいのかな?
まだハイパーリンクに仕込む番号は半角化しないとならないな。


641 :nobodyさん:2005/09/08(木) 16:35:13 ID:???
アンカー開始記号は (>|>>|>|>>|≫) じゃなくて
(>>|>|>>|>|≫) みたいにして長い方のパターンを先にしなきゃダメじゃない?

642 :nobodyさん:2005/09/08(木) 16:47:57 ID:???
>>641
順番は関係ない。
どうせ非決定性オートマトンになった時、同じ状態からヒモが伸びるだけ。

643 :nobodyさん:2005/09/08(木) 17:07:45 ID:???
あ、なんか変な勘違いしてた。スレ汚しスマソ。

644 :nobodyさん:2005/09/08(木) 17:08:37 ID:???
あ、念のため。 >>641 = >>643 ね。

645 :623:2005/09/08(木) 20:11:30 ID:???
>>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さんのように、正規表現を一つにまとめないと駄目みたいですね。。

646 :nobodyさん:2005/09/08(木) 20:27:23 ID:???
だから([0-90-9]+)(-([0-90-9]+))?の?は、
後半があれば必ず長い方に一致させるから
心配しなくていい。

前後の([^\;]|^)や([^<-]|$)が、lineに格納されたスペースを食っちゃってる
ようだけど。

647 :646:2005/09/08(木) 20:32:18 ID:???
あ、そうかto=にも同じ番号入れるんですね。
間違えた。

648 :nobodyさん:2005/09/08(木) 20:38:19 ID:???
>>646 も指摘しているけど、前後のパターンは要らないと思う。何でそれ付けてるの?

649 :nobodyさん:2005/09/08(木) 20:41:11 ID:???
document.write("<xmp>");
document.write(line);
としてみたらやっと気付いたけど、今のままでも
2回目の置換では<a href="...">2</a>とかタグの終了の>
置換してるのが原因だな・・・

650 :nobodyさん:2005/09/08(木) 20:44:19 ID:???
<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>

ではこれでどう?

651 :650:2005/09/08(木) 20:47:45 ID:???
間違った。だめだorz

652 :623:2005/09/09(金) 19:15:40 ID:???
よく考えたらレス番数字の正規表現はこのままだと
「>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&〜」なのです・・

何だか駄々をこねてるみたいで申し訳ないです・・。

653 :650:2005/09/09(金) 20:44:02 ID:???
うまくいかない物を貼ってすいません。
今度は大丈夫だと思います。

<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);

654 :650:2005/09/09(金) 20:45:42 ID:???
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>


655 :651:2005/09/10(土) 11:01:20 ID:maA6hdJk
preg_match("/^(x83[\x40-\x96]|\x81\x40|\x81\x5B)+$/", $nnn )
PHPで全角カタカナとハイフンと全角スペースだけを通したいんだけどこれ間違えてる?


656 :623:2005/09/10(土) 19:09:02 ID:???
>>653-654>>650さん
すみません、後でじっくりやってみます・・・。
正規表現の内部(?)でも javascript使えるんですね。


244 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)