トップページ⇒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/
0548nobodyさん2005/07/23(土) 23:16:24ID:???
>>547
問題ない。
05495472005/07/23(土) 23:22:51ID:???
>>548

どうもありがとです。
0550nobodyさん2005/07/24(日) 01:10:29ID:???
あちこち捜したんですが、うちの詳説正規表現がなくなって、
どこに行ったかわかりません。スレ違いかも知れませんが、
ポインタだけでもお示しいただければ幸いです。
0551nobodyさん2005/07/24(日) 01:31:12ID:???
ふとんの間に挟まってる
0552nobodyさん2005/07/24(日) 12:09:04ID:???
>>551
真っ先に布団を捜したんですがありませんでした。
あれを家から持ち出すはずがないので、空き巣にでも
入られたんじゃないかと心配になってきました。
0553nobodyさん2005/07/24(日) 13:44:01ID:???
通な空巣だよな。
0554nobodyさん2005/07/24(日) 13:47:30ID:???
こないだケツ拭くのに使ったじゃんお前
0555nobodyさん2005/07/24(日) 15:49:03ID:vU2XL6go
>>550
おまいの心の中にしまってあるんだよ・・・
0556nobodyさん2005/07/24(日) 18:01:34ID:???
>>550
らくだ盆と一緒に枕カバーの中に入れたのを忘れたか?
最近妙に枕硬いな・・・って思わんか?
0557nobodyさん2005/07/24(日) 21:17:58ID:???
ラクダ本は預かった、返して欲しくば ttp://game10.2ch.net/test/read.cgi/mmosaloon/1122179577 まで来い
0558nobodyさん2005/07/24(日) 23:04:10ID:???
>>557
人質にするならふくろう本の方だと思われ(w
05595502005/07/25(月) 00:40:13ID:???
お騒がせしてすみません。ありました。トイレの棚の上に
置いてありました。トイレットペーパーなんかを置く棚です。
下痢の時とかトイレに本を持ち込むんでした。

>>554
あれは確か、Perlで作るCGI入ry

スレ汚し申し訳ありませんでした。「単語境界とは何か」
ということについて、これからじっくり考えてみます。
0560nobodyさん2005/07/25(月) 09:11:16ID:???
http://192.168.1.0/http://192.168.1.0/
普通こんな感じ
05615602005/07/25(月) 09:12:21ID:???
ごめ。
間違えた。
0562nobodyさん2005/07/27(水) 03:13:00ID:rvBHMPTm
phpのpregです。文字列を空白で分割して、空でない要素のみ
配列に格納します。

$array = preg_split("/\s/", $string, -1, PREG_SPLIT_NO_EMPTY);

この時、空白だけではなく

「英数字か記号1字で、前後が英数字でない文字」

も区切り文字として正規表現に加えたいんですが、どういう風に
書けばいいでしょう? お願いします。
0563nobodyさん2005/07/27(水) 13:59:47ID:???
/(?<=[^A-Za-z0-9])[\x00-\x7f](?=[^A-Za-z0-9])/ とか?

「英数字か記号1字で、前後が英数字でない文字」 だと記号は全部消える気がするんだけどいいのかしら。
"記号"は"文字"の中に含まれない、ってことかな?
05645622005/07/27(水) 15:16:57ID:???
>>563
すいません、説明がダメダメでした。英数字でも記号でも、
1字のみの場合は空白と同じ扱いにしたいということです。

$string = "This is a pen."; なら
Array ( [0] => This [1] => is [2] => pen. )

$string = "A to Z"; なら
Array ( [0] => to )

$string = "15 - 9"; なら
Array ( [0] => 15 )

$string = "YOMIURI ON-LINE"; なら
Array ( [0] => YOMIURI [1] => ON-LINE )

という具合です。なんだかよくわからなくなってきました。
0565nobodyさん2005/07/27(水) 16:12:52ID:???
えー。

/(?:^|\s+).(?:\s+|$)|\s+/

↑こういうのとは違う?
"A to Z" は [0] => to にならないよ。
05665622005/07/27(水) 17:14:16ID:???
>>565
ありがとうございます。えーと、先に挙げた例でうまくいかないのは
"A to Z"ではなく"15 - 9"が

Array ( [0] => 15 [1] => 9 )

となるわけですが、これって /(?:^|\s+).(?:\s+|$)|\s+/ の前の方の
表現で" - "がマッチして、残りの9はマッチしなくなるんですね?
"1 2 3 4 5"でやってみると

Array ( [0] => 2 [1] => 4 )

となります。こういう時ってどこで勉強したらいいんでしょうか?
なんかもう頭が泥沼です。
0567nobodyさん2005/07/27(水) 17:42:00ID:???
あ、そうか、正直すまんかった。

/(?:^|\s+|(?<=\s)).(?:\s+|$)|\s+/

でどうよ?
0568nobodyさん2005/07/27(水) 17:47:02ID:???
いや、こうか。

/(?:(?:^|\s+|(?<=\s)).(?:\s+|$)|\s+)+/

何度もスマン。
05695622005/07/27(水) 18:20:12ID:???
>>568
いえいえ、何度もありがとうございます。期待した通りの
結果が得られたのですが、表現がそこまで行くと私には
魔法の呪文としか理解できなくて、もしよろしければ少し
解説いただけませんでしょうか?

(?:...) が、グループ化、ということはわかったのですが、
(?<=\s)) というのは何でしょう? たびたび恐縮ですが
正解を教えてもらうだけでなく、表現の中身も理解して、
自分で解を導けるようになりたいです。お願いします。
0570nobodyさん2005/07/27(水) 19:59:22ID:???
> (?<=\s)
何て言うんだっけ、「前方一致言明」 とかだっけ。
文字列 (上の場合".(?:\s+|$)") の前に、"\s"があった場合、マッチする、ってやつ。
まあ、下記参考ー

[PHP マニュアル] -> [パターン構文]
http://php.s3.to/man/pcre.pattern.syntax.html#regexp.reference.assertions

[SMART]->[PERL]->[正規表現]
http://www.rfs.jp/sitebuilder/perl/02/09.html の [拡張構文]
05715622005/07/27(水) 22:39:51ID:???
>>570
ありがとうございます。ちゃんと勉強しないとダメですね。
知らないことばかりです。何度もお世話になりました。
0572nobodyさん2005/07/28(木) 11:40:06ID:???
,区切りデータで、データ内に,があった場合は\,のようにしています
さらに\,は\\,のようにしています

perlでこれを分割したいのですが、
,に一致して(\\)+,に一致しないものはどう書けばよいのでしょう
よろしくお願いします
0573nobodyさん2005/07/28(木) 11:45:32ID:???
/(?<!\\),/
0574nobodyさん2005/07/28(木) 11:50:38ID:???
早い対応、ありがとうございます
0575nobodyさん2005/07/28(木) 12:08:05ID:MIm3P7gz
GETで吐き出されたURLを置換したいのです。

?A=1111&B=2222&C=33&D=444 から「=」と「&」と「?」を抜き取りたい。
(A1111B2222C33D444 みたいな感じ)

それだけなら何とか今の知識で大丈夫なのですが、
このAやらBやらが毎回この順番でなるわけではなく、
しかも出現したりしなかったりするわけです。

?B=2223&A=1111&D=444 とか
?C=33&A=1111 のようになることもあります。

うまいこと置換する方法を教えて下さい。
0576nobodyさん2005/07/28(木) 12:39:27ID:???
へ? /[=&?]/g でいいんじゃないの?
perl なら tr/=&?//d;
0577nobodyさん2005/07/28(木) 13:49:11ID:???
出現順も置き換えるのはここでは取り扱えないんでないかの
0578nobodyさん2005/07/28(木) 14:04:30ID:???
mod_rewriteを使ってのURL書き換えだったんだけどけど、
色々悩んでいるうちに解決しちゃいました。

>>576-577 さんありが�d
0579nobodyさん2005/07/28(木) 14:16:26ID:???
一応はっとく
^(?:(A)=(\d+)|(B)=(\d+)|(C)=(\d+)|(D)=(\d+)|[^?&]+|[?&])+$⇒$1$2$3$4$5$6$7$8
?A=123&C=456&B=0&A=2222&F=0000&DUMMY⇒A2222B0C456
0580nobodyさん2005/07/28(木) 14:19:16ID:???
>>579
スンバラシイ!!!!
0581nobodyさん2005/07/28(木) 15:43:53ID:???
1個のcgi内でPOSTを2回したらなぜか改行コードの後に改行コードが1個追加されてました
1回目送られてきたデータをURLデコード後、ハッシュにばらして同じ名前、値でもう1回送ることです

改行コードはまず<br>に変換します
その後、<br><br>を<br>に置換したいのすがどのように書けばいいでしょうか?
もしくは根本的な解決方法はあるでしょうか?
05825812005/07/28(木) 17:03:13ID:???
自己解決
各<br>の前に0x0dが含まれてた('A`)
0583nobodyさん2005/07/29(金) 13:13:28ID:???
色々調べてて\の意味がいまひとつ分からないんだが、
例えば /\"/ と/"/ の違いって一体何ですか?
0584nobodyさん2005/07/29(金) 14:58:02ID:???
Perl の話と仮定してよろしい?

\ には大きく分けて二通りの意味があって、

1. (主に) 正規表現のメタ文字として使われる文字を、メタ文字でない通常の文字として解釈させる
2. 正規表現のメタ文字でない文字 (英数文字など) に特殊な意味を持たせる

その例だと 1. になって、単なる " として解釈されるようになる。
ただ " はもともとメタ文字としての意味はないので、要するに、両者に違いは無い。
0585nobodyさん2005/07/29(金) 16:05:14ID:???
perlの話です、すみません
"を&quot;に変換する正規表現がサイトによって異なっていたので気になってました
ありがとうございます
0586nobodyさん2005/07/29(金) 18:57:13ID:???
>>585
記号を見ると脊髄反射で\をつけるんだと思う
0587nobodyさん2005/07/29(金) 19:33:29ID:???
テキストエディタが "〜" の中の色を変えてくれるんだけど、
s/"// だと後の色変わっちゃって読みにくいので、s/\"// にしちゃう。
0588nobodyさん2005/07/30(土) 00:23:34ID:???
そんなエディタは投げ捨てるんだ!!
0589nobodyさん2005/08/02(火) 23:32:23ID:Yo8mbngH
PHP4で、特定の文字列が、IPアドレスであるか、
そうでないかの判定を行いたいと思ってます。

$str = "192.168.0.1";

if ( ereg("(\\d+)\.(\\d+)\.(\\d+)\.(\\d+)", $str) ) {
echo "入力された文字は、IPアドレスです";
} else {
echo "入力された文字は、IPアドレスではありません";
}

↑のようなコードで実行したのですが、どうしても、
IPアドレスであると判断してくれません。
どのようにすれば、IPだと判定してくれるのでしょうか<(_ _)>
0590nobodyさん2005/08/03(水) 00:41:00ID:???
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE+IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9+PHP&num=50
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=にも同じ番号入れるんですね。
間違えた。
■ このスレッドは過去ログ倉庫に格納されています