[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 07/03 06:01 / Filesize : 179 KB / Number-of Response : 640
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

正規表現道場



1 名前:nobodyさん [2007/01/11(木) 02:40:43 ID:uW7xEbZY]
【正規表現道場の掟】

・言語不問

・質問も大歓迎。使用言語を書くのを忘れずに。

正規表現と関係ない話・質問は他スレへどうぞ。

475 名前:nobodyさん mailto:sage [2009/03/02(月) 21:22:30 ID:???]
httpから始まり、半角英数字と.?&%が含んでるか見ればおk

476 名前:nobodyさん mailto:sage [2009/03/05(木) 18:30:50 ID:???]
>>471
先生 ノシ
「.*?」で最初の一匹目のカニも取れませんでした。
でも幻のカニは取れたみたいです。

477 名前:nobodyさん mailto:sage [2009/03/11(水) 00:46:27 ID:???]
*.2ch.net/*/test/bbs.cgi*
これを正規表現にすると、どうなりますか?


478 名前:nobodyさん mailto:sage [2009/03/11(水) 01:27:39 ID:???]
*.2ch.net/*/test/bbs.cgi*

479 名前:nobodyさん mailto:sage [2009/03/11(水) 11:15:58 ID:???]
>>477
"{^https?://[0-9a-zA-Z]*\.2ch\.net/[0-9a-zA-Z]*/test/bbs\.cgi[0-9a-zA-Z/_-]*$}"

480 名前:nobodyさん mailto:sage [2009/03/20(金) 02:34:11 ID:???]
phpのクラスファイルの特定の関数を正規表現で抜き出したいのですが可能でしょうか?

例 class.test.php から public function test($a){ 本文 }

スケルトンコードの場合簡単に抜き出せるのですが、
本文中にif,swichなどで } が存在した場合どうすれば良いのか悩んでいます。

481 名前:nobodyさん mailto:sage [2009/03/20(金) 04:11:43 ID:???]
{が出たら探す}を1つ増やせばいいじゃん

482 名前:nobodyさん mailto:sage [2009/03/20(金) 22:15:43 ID:???]
言語は
BoostライブラリBoost.Xpressiveか、Boost.Regexか、Boost.Spirit
です。(標準C++,コンパイラg++。)

括弧の対応のバランスがとれているならマッチさせるという正規表現はどう書けますか?
boost::xpressive::sregex parens;
parens = *( '(' >> by_ref(parens) >> ')' );
だと
 ()→マッチ
 ()()→マッチ
 ()(()((()))())→マッチ
 (()))))→マッチしない
です。
私としては(1+3)*(4+(8-9))の様に括弧以外の文字が含まれていても括弧のバランスがとれているか判定できるようにしたいのですが。
ただし括弧としては ( か ) だけを想定し、{}[]などは判定の対象にはせず、数式として成り立っているかどうかなども判定せず、あくまで ( と ) のバランスだけを見たいです。



483 名前:nobodyさん mailto:sage [2009/03/20(金) 22:25:59 ID:???]
>>481
できました、ありがとうございました。
こんな感じで、簡単でしたね、、、

 /function test.*?\{.*? (\{.*?\}.*?)*? \}/s



484 名前:nobodyさん mailto:sage [2009/03/20(金) 23:13:32 ID:???]
echo内の { } にも対応してみました。
これでほぼ完璧かなぁ、、、
/public\sfunction\stest_if_text.*?\{.*?(\{.*?("(.*?\{*?.*?|.*?\}*?.*?)*?".*?)*?\}.*?)*?\}/s

485 名前:nobodyさん mailto:sage [2009/03/20(金) 23:18:29 ID:???]
センスねえな
ムダがおおい

486 名前:nobodyさん mailto:sage [2009/03/20(金) 23:28:45 ID:???]
関数名だけで対応すると
/[public|private|protected]+\s+[static]?\s?function\s+関数名.*?\{.*?(\{.*?("(.*?\{*?.*?|.*?\}*?.*?)*?".*?)*?\}.*?)*?\}/s
こんな感じかなw
読みやすさ優先で記述してるからセンスは勘弁してくださいw

487 名前:nobodyさん mailto:sage [2009/03/24(火) 08:12:11 ID:???]
>>482
正規表現だけじゃ無理じゃね?

488 名前:nobodyさん mailto:sage [2009/03/24(火) 09:59:04 ID:???]
>>482
正規表現じゃ数学的に不可能。有限状態オートマトンなので閉じられてない
開きカッコの数を高々状態数までしか憶えられないからそれを越えた時点で
アウト。

Perlの正規表現みたいに再帰的なパターンが書けるように拡張されてると
別だけどね。

489 名前:487 mailto:sage [2009/03/24(火) 10:07:28 ID:???]
>>482
BoostのXpressiveならby_ref()があるから再帰的に書けないこともないハズ。
でもよーわからん。
Spiritが使えるならそっちのが楽そうじゃね?

490 名前:nobodyさん mailto:sage [2009/03/24(火) 10:20:21 ID:???]
「高々状態数」の意味がわかりません。

491 名前:nobodyさん mailto:sage [2009/03/24(火) 10:38:59 ID:???]
数学じゃよくでてくるけどね、「高々」とか「状態数」とか

492 名前:nobodyさん mailto:sage [2009/03/24(火) 10:40:15 ID:???]
>>491
俺は初めて聞いたぞ。
たかだかはよく出て来るけど(例:たかだかn次の〜)
状態数は物理学の用語じゃね?

493 名前:nobodyさん mailto:sage [2009/03/24(火) 12:16:31 ID:???]
お前ら正規表現スレにいて有限状態オートマトンもわからんのか...
いくらなんでもゆとりすぎるだろ



494 名前:nobodyさん mailto:sage [2009/03/25(水) 10:08:36 ID:???]
文字xが10個以上である場合にマッチさせるのに
x{9}x+

x{10}x*
は共に等価でOKだとおもうが、
一般論で言うとどちらが速い動作になる?

495 名前:nobodyさん mailto:sage [2009/03/25(水) 10:43:53 ID:???]
どっちも同じ動作なんだから同じじゃね
それよりももう少し改良できると思うんだがな

496 名前:nobodyさん mailto:sage [2009/03/25(水) 12:38:18 ID:???]
実装次第で一般論ではなんともいえないと思われる。

どっちを食わせても全く同じオートマトンに変換してから実行するの
でぴったり同じになる実装、なんてのもあるかもしれないし、
逆になぜか+が不得意な実装とか*が不得意な実装とかあるかも
しれない。モノによっては{..}が不得意でxを並べたほうがいいと
いうことも考えられるな。

497 名前:494 mailto:sage [2009/03/25(水) 15:11:33 ID:???]
>>495-496
なるほど。
ありがとう。。。

498 名前:中山 [2009/03/29(日) 09:39:01 ID:MqxV8vA3]
PHP 正規表現について

$str = 'test1?test2/test3;test4';

この文字の
test1
test2
test3
test4
を取り出すにはどうしたらよいでしょうか?

この価を
data1=test1&data2=test2&data3=test3&data4=test4
と変換したいです

preg_replaceを使っています
$str = preg_replace("・^([a-zA-Z0-9]+\?+[a-zA-Z0-9]+)\/+[a-zA-Z0-9];+[a-zA-Z0-9)$・","data1=$1&data2=$2&data3=$3&data4=$4",$str));


これではダメみたいです

499 名前:nobodyさん mailto:sage [2009/03/29(日) 09:49:02 ID:???]
どーゆークエリだそりゃ

500 名前:nobodyさん mailto:sage [2009/03/29(日) 09:54:22 ID:???]
$str = 'test1?test2/test3;test4';
この内容がどういうパターンで変動し得るかがわからん
書かれている正規表現見てみると ? / ; の順に区切り文字があることは固定で決まってる?

501 名前:中山 [2009/03/29(日) 19:51:10 ID:MqxV8vA3]
はい。固定できまってます。

ただし、

test1
などの文字列は半角英数字限定です。

502 名前:nobodyさん mailto:sage [2009/03/31(火) 12:09:46 ID:???]
>>498
data1,data2,data3・・・きめえwww

503 名前:nobodyさん mailto:sage [2009/04/14(火) 19:16:36 ID:???]
以下のような文字列を置換ですべて削除したいのですが
どうかけばいいのでしょうか

onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()"
onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()"
onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()"

3行すべて削除

試した正規表現
onMouseOver="refPopUp(\d+{1,3}.,event)" onMouseOut="hidePop()"



504 名前:nobodyさん mailto:sage [2009/04/14(火) 19:24:30 ID:???]
3}.,の.ってなによ

505 名前:nobodyさん mailto:sage [2009/04/14(火) 19:31:15 ID:???]
>>504
すまんこ

一応自力解決しました。さくらエディタの正規表現オンで動作確認
onMouseOver="refPopUp\(\d{1,3},event\)" onMouseOut="hidePop\(\)"

506 名前:nobodyさん mailto:sage [2009/04/14(火) 20:09:33 ID:???]
下記の2文にあるfontタグを消したいです。
正規表現を用いた1度の置換で消せますか?

<dd><font style="font-size:;color:;"> テスト <br> テスト </font><br><br></dd>
<dd><font style="font-size:;color:;"> テスト2 <br> テスト2 </font><br><br></dd>


考え方として
<dd><font style="font-size:;color:;">がある行のうち</font>を削除し、そのあと<font style="font-size:;color:;">を削除
これで行けそうかと思ったのですが、●●がある行のうち○○を削除、という正規表現がわかりませんでした・・・

507 名前:nobodyさん mailto:sage [2009/04/16(木) 23:48:40 ID:???]
>>506

(.*)<font style="font-size:;color:;">(.*)<\/font>(.*)
$1$2$3
とすればいいんじゃない。
どこの正規表現を使うかによりできないかもしれないけど。

$nはn番目の括弧に該当するから<font style="font-size:;color:;">と</font>が消える。
<font></font>がネスとしているなど複数あったら駄目かもしれないけど。

508 名前:nobodyさん mailto:sage [2009/04/17(金) 04:08:26 ID:???]
>>507
サクラエディタで正常に動作することを確認しました。
ありがとうございます!

509 名前:nobodyさん mailto:sage [2009/04/25(土) 21:30:02 ID:???]
 ヽ('A`)ノ  ○○表現!
  (  ) 
  ノω|


510 名前:nobodyさん mailto:sage [2009/04/29(水) 05:47:07 ID:???]
チカンしまくり

511 名前:nobodyさん mailto:sage [2009/05/12(火) 06:32:22 ID:???]
12?34
12??34

違いが出るときはどんなときか答えなさい


512 名前:nobodyさん mailto:sage [2009/05/18(月) 16:49:08 ID:???]
$txt = aaa(’12165;

のような、固定文字列aaaの後ろに『(’nnnnn;』(nの部分は必ず半角数字で値と文字数は可変。’は全角)となる箇所がうじゃうじゃあり、
この文字列の数字を挟んでいる記号だけを全て削除したいのですが、しっくりくる正規表現が浮かびません
妙案ないでしょうか

php5 or 4

513 名前:nobodyさん mailto:sage [2009/05/18(月) 22:40:33 ID:???]
aaaの後ろにうじゃうじゃって
$txt = aaa(’12165;
$txt = aaa(’5445;
$txt = aba(’13;
$txt = aaa(’99999;
こうなんか?

結果 = preg_replace('/’(\d+);/', '$1', 入力);

結果
$txt = 12165
$txt = 5445
$txt = aba(’13;
$txt = 99999





514 名前:nobodyさん [2009/05/21(木) 08:03:14 ID:bdo2M1uu]
すみません、質問させてください。

曲名のリストを一括置換しようとしています。具体的には"〜 by"が
入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。


This is me (talk) (Composed by Johan)

This is me (talk) [Composed by Johan]

どのような書式にすればいいかご教示お願いします。


515 名前:nobodyさん mailto:sage [2009/05/21(木) 08:25:36 ID:???]
正規表現と一言に言ってもね、正規表現にもいろいろあってね、どの正規表現かで
書き方も全然違ってくるからね、その質問だけじゃなんとも言えないのね。

初心者用のサイトにいってらっしゃいなのね。

図解でみる正規表現入門
funcchan.blog16.fc2.com/

516 名前:nobodyさん mailto:sage [2009/05/21(木) 08:34:21 ID:???]
$s= "This is me (talk) (Composed by Johan)";
$s=~ s/\(([^\)]*\bby\b[^\)]*)\)/[$1]/gi;

517 名前:nobodyさん mailto:sage [2009/05/21(木) 09:43:06 ID:???]
>>515-516
ありがとうございます。

STEPというタグエディタで100曲ほど一括置換しようと
目論んでます。

教えていただいたサイトとスクリプトを手がかりに
現在悪戦苦闘中です。ちょっと頑張ってみます。

518 名前:nobodyさん mailto:sage [2009/05/23(土) 22:18:11 ID:???]
こういうときにこまるわけか

special days(arranged by hor version.) (Composed by Ellic)



519 名前:nobodyさん mailto:sage [2009/05/27(水) 00:18:24 ID:???]
質問させて下さい。

ABC
…LMNO………
……LMNO……
………LMNO…
XYZ

というような文章があったとします。
「LMNO」の前後(「…」)には文字(日本語や英数字)があります。

Perl5互換の正規表現が使えるテキストエディタや、BREGEXP.DLLが使える置換えソフトを使用し、
「ABC」から「XYZ」までにある「LMNO」を「OOOO」に置換えすることは可能でしょうか?
特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定で困っています。
どのようにすれば良いのか教えて頂けると助かります。よろしくお願いします。

520 名前:nobodyさん mailto:sage [2009/05/27(水) 22:50:49 ID:???]
s/(ABC.*)LMNO(.*XYZ)/$1OOOO$2/g
ってことか?

521 名前:519 mailto:sage [2009/05/29(金) 23:05:57 ID:???]
>>520
具体的な指定を教えて頂いてありがとうございました。
早速試したのですが置換えできませんでした。
「Speeeeed」という置換えソフトではBREGEXP.DLLも使えるのですが、それでも置換え結果がゼロのままです。
こちらのスレをもう一度読み返してもっと正規表現を勉強したいと思います。

522 名前:nobodyさん mailto:sage [2009/06/07(日) 21:54:50 ID:???]
s/(?>ABC)(.*)LMNO(.*)(?<=XYZ)/${1}0000$2/
これを何回もかけるとか?
なんか知らんけどgオプションつけても無駄だったんだよなぁ

523 名前:nobodyさん mailto:sage [2009/06/11(木) 09:11:23 ID:???]
>>521
>>520にsパターン修飾子つけて再帰させるしかねーよ



524 名前:nobodyさん mailto:sage [2009/06/12(金) 11:14:20 ID:???]
sed でも使えばー?

525 名前:nobodyさん [2009/06/13(土) 23:07:31 ID:56/XckFT]
Perlの正規表現で質問させて下さい。
yyyy/mm/entry-basename/index.php
↑はどのように記述すればいいのか、お手数ですがご教授願います<(_ _)>

526 名前:nobodyさん mailto:sage [2009/06/14(日) 09:14:31 ID:???]
正規表現で表すには前提条件がないと答えられない
yyyy部分が4桁数字の西暦?
mm部分が2桁数字の月(ゼロサプレス)?

m#^\d{4}/\d\d/entry-basename/index\.php$#

527 名前:525 [2009/06/14(日) 17:21:47 ID:Ycy68Wtw]
>>526さん解凍有り難う御座います。
素人で質問が下手くそで申し訳有りません
↓の場合だと
"/diary/archives/yyyy/mm/entry_basename.php"
"/^\/diary\/archives\/\d{4}\/\d{2}\/(\w+)\.php/"
↑のように置き換えるみたいなのですが、

同様に↓の場合だと
"yyyy/mm/entry-basename/index.php"
どのように置き換えるのかが分からなくて、お手数ですがご教授下さい。

分かりにくくて申し訳ないです。

528 名前:nobodyさん mailto:sage [2009/06/14(日) 21:15:28 ID:???]
ちなみにゼロで桁を埋めるのは「ゼロパディング」ね。


> ↑のように置き換えるみたいなのですが、

「置き換える」って、いわゆる正規表現による置換処理の意味じゃなくて
「検索表現に翻訳する」って意味なのか。凄まじく紛らわしい。

さておき…、
で、どの単語が可変部分なのかがさっぱり分かんないんだよね。
"index.php" は固定なの?

それと、上の置き換え例では "entry_basename" になっているけど
お尋ねの件は "entry-basename" だよね。単なる typo かな?
"\w" を使う上では、検索対象文字列の "_" と "-" との違いは本質的だよ。

要するに、質問するにしては不備が多過ぎます。

529 名前:525 [2009/06/14(日) 23:33:00 ID:Ycy68Wtw]
>>525です

「検索表現に翻訳する」という意味です。失礼しました
そして"index.php"は固定で、"entry-basename"が正解です。

www.magicvox.net/archive/2005/05261744/
ここのページにあるランキングが利用したいのですが、
「ランキング集計したいファイル名にマッチするよう Perl の正規表現
を修正してください。」

ここの意味が分からなくて困っています。他のサイトなどを見てみると、
当方の個別エントリーパスは"/diary/archives/yyyy/mm/entry_basename.php"なわけですので、
"/^\/diary\/archives\/\d{4}\/\d{2}\/(\w+)\.php/"としました。
とあります。

私の場合、エントリーパスは"yyyy/mm/entry-basename/index.php"です。
これを"/^\/diary\/archives\/\d{4}\/\d{2}\/(\w+)\.php/"のように記述
するにはどうすればいいのでしょうか?

長文失礼しました。

530 名前:nobodyさん mailto:sage [2009/06/15(月) 00:03:48 ID:???]
'/\d{4}\/\d{2}\/(\w+)\/index\.php/'

謎すぎるけど PHP の preg 使って entry_basename を $1 に入れるんだと
思い込んでみた

531 名前:nobodyさん mailto:sage [2009/06/15(月) 00:06:02 ID:???]
で、その "entry-basename" ってのはその文字列そのものではなくて
「ここにいろんな文字列が入ります」っつーダミーなんだろうけど、
どういった文字で構成されるの?

532 名前:nobodyさん mailto:sage [2009/07/05(日) 16:07:10 ID:???]
perlでテキストデータ内の日付部分を、
2009/1/1

2009/01/01
に一行で置換したいのですが。
s|/([0-9][^0-9])|/0$1|gm;
だと、2回同じ処理が必要になってしまいます。
いい方法ありますか?

533 名前:nobodyさん mailto:sage [2009/07/05(日) 16:12:40 ID:???]
splitとsprintf



534 名前:nobodyさん mailto:sage [2009/07/05(日) 17:05:36 ID:???]
>>532
後ろの1文字ってマッチする?
マッチするなら
1 while $str =~ s|/([0-9][^0-9])|/0$1|gm;
でいけるんじゃない

535 名前:nobodyさん mailto:sage [2009/07/05(日) 17:40:16 ID:???]
m はなくてもよさそうに見える

536 名前:nobodyさん mailto:sage [2009/07/05(日) 18:26:28 ID:???]
>>534
できました。ありがとうございます!

>>535
おっしゃる通りでした。


537 名前:nobodyさん mailto:sage [2009/07/05(日) 18:27:53 ID:???]
たぶんgもいらないよ

538 名前:nobodyさん mailto:sage [2009/07/08(水) 01:27:46 ID:???]
$str =~ s{/([0-9])(?![0-9])}{/0$1}g;

539 名前:nobodyさん mailto:sage [2009/07/15(水) 09:40:19 ID:???]
秀丸で、CSSの : までの部分を強調表示したいのですが、
どう表現すればいいのでしょうか。
以下の例だと、font-size:の部分です。

h1 {
font-size: 150% !important;
}

540 名前:nobodyさん mailto:sage [2009/07/15(水) 13:56:52 ID:???]
>>539
CSSに数字って出るんだっけ?
[\-a-za-z0-9]+[ \t]*:

541 名前:nobodyさん mailto:sage [2009/07/15(水) 14:47:39 ID:???]
ありがとうございます。
見やすくなりました!
:first-childや:notのセレクタで誤爆していたので

[\-a-za-z0-9]+[ \t]*:(?!\first|last|not)

としました。

また以下のようなものだと誤爆するみたいですが
これはほとんど使わないので目をつむろうと思いますw

BODY[style="width: 100%; height: 100%;"] {
font-size: 150% !important;
}

542 名前:nobodyさん mailto:sage [2009/07/15(水) 15:14:34 ID:???]
良く考えたらもっと一杯あった
[\-a-za-z0-9]+[ \t]*:(?!first|last|not|hover|focas|active|visited|link|lang|after|before)

543 名前:nobodyさん [2009/07/15(水) 23:25:43 ID:2a7dmfqp]
/(^-^;)/w(^o^)vv(-_-;)vv[^-^](^_^;)/



544 名前:nobodyさん mailto:sage [2009/07/22(水) 16:01:40 ID:???]
すみません質問させてください。
正規表現初心者です。
秀丸で、正規表現を使って文字列の置換をしようとしています。

例)
abcd,efag),

これを最初の[,]だけを[',]に置換したいと思っています。

検索文字列: [^)],
置換文字列: ',
とすると、

abc',efag),

のように文字列の後ろの1文字まで消えてしまいます。
文字列が消えないように、最後尾でない[,]だけを置換するにはどのように指定すればいいでしょうか。
教えてください。

545 名前:nobodyさん mailto:sage [2009/07/24(金) 05:32:15 ID:???]
秀丸でサポートされている正規表現の機能がどれだけのものか分からんからなあ。

候補 1(質問者の方針参考)
検索文字列: ([^)]),
置換文字列: $1',

候補 2
検索文字列: ,(?!$)
置換文字列: ',

無理なら一旦「,\n」を「,」を含まない別の適当な文字列に変換して、
全ての「,」を「',」に変換してから元に戻すとか。

546 名前:nobodyさん mailto:sage [2009/08/01(土) 13:06:24 ID:???]
候補 3
検索文字列: |-^)v!!
置換文字列: (^o^)/~~

547 名前:nobodyさん mailto:sage [2009/09/01(火) 17:17:50 ID:???]
PHP5で、$txtに格納された

<a href="javascript:userid('123456');">テキスト</a>
※「123456」と「テキスト」は変化します

といった並びの文字列からタグをぬいて

123456,テキスト,

とカンマ区切りにしたいのですが、何か良い方法はないでしょうか

548 名前:nobodyさん mailto:sage [2009/09/01(火) 17:51:35 ID:???]
自己解決しました
お騒がせして申し訳ありますん

549 名前:nobodyさん mailto:sage [2009/09/03(木) 10:54:41 ID:???]
>>548はだれ?

550 名前:nobodyさん [2009/09/03(木) 12:19:35 ID:54RqrMPZ]
301でサイト移動をする場合に関数に色々な値があるのをそれぞれリダイレクトさせたい場合は
一挙に書くにはどうすればいいでしょうか?


1つ1つ書くと下記のようなのを1つにしたいです。

Redirect 301 /index.php?a=1 "www.sample.jp/index?a=1"
Redirect 301 /index.php?a=2 "www.sample.jp/index?a=2"
Redirect 301 /index.php?a=3 "www.sample.jp/index?a=3"
 ・
 ・
 ・
Redirect 301 /index.php?a=a1 "www.sample.jp/index?a=a1"
Redirect 301 /index.php?a=b2 "www.sample.jp/index?a=b2"
Redirect 301 /index.php?a=c3 "www.sample.jp/index?a=c3"
 ・
 ・
 ・

551 名前:nobodyさん mailto:sage [2009/09/03(木) 12:27:59 ID:???]
>>550
誘導元で礼も無しとか失礼な人だな

552 名前:nobodyさん [2009/09/03(木) 12:47:58 ID:54RqrMPZ]
率直に言って「スレ違い」って程のことか?
と思ったので礼などは書かなかった。

どっちかというとこっちの方が適切とは思うが、
【.htaccessファイル(「分散設定ファイル」)の書き方・使い方などに関するスレです。 】
って説明のスレに書いても別に間違ってないと思う。

553 名前:nobodyさん mailto:sage [2009/09/03(木) 15:52:56 ID:???]
>>550
スレ違い。

【Apache】mod_rewriteについて語るスレ
pc11.2ch.net/test/read.cgi/php/1023791370/


個人的には礼とかどうでもいいと思うけど、
マルチ質問扱いされて厄介なことになる可能性があるので、
「向こうで質問し直します」とかひとこと言っておいた方が無難とは思う。

あと、ドメインの例示に使えるのは "example.jp" ね。



554 名前:nobodyさん mailto:sage [2009/09/13(日) 17:57:11 ID:???]
PHPでPerl互換のpreg_replace関数を使った置換を行おうとしているのですが、
やりたいことがうまく実現できません。

やりたいことは、

・<tagA>という文字列と</tagA>のあいだに<tagInsert>という文字列を挿入したい
・ただし、<tagA>の中に<tagB>という文字列がある場合は、その<tagB>の下に挿入したい


<失敗した正規表現>
$new_str = preg_replace("/<tagA(.*?)>(.*?)(<(?!tagB).)*/", '<tagA\\1>\\2<tagInsert>\\3', $str);

<実現したい例>
<tagA>
<tagB>
<tagB>
<tagC>
</tagA>

↓置換実行
<tagA>
<tagB>
<tagB>
<tagInsert>
<tagC>
</tagA>

555 名前:nobodyさん [2009/09/27(日) 12:15:08 ID:???]
 /身長:(\d+)\n体重:(\d+)/
という正規表現に対し、例えば
 "身長:175\n体重:67"
という文字列がきたら
 "身長:<font color="red">175</font>\n体重:<font color="blue">67</font>"
のようにHTMLタグを追加したい。

ただし
 "身長:100\n体重:100"
のように身長と体重が同じ場合も身長は赤、体重は青にしたい。

もっと欲をいえば正規表現は身長・体重だけでなく
 /年齢:(\d+)\n好きな食べ物:(\S+)/
のように可変にしたい。


556 名前:nobodyさん mailto:sage [2009/09/27(日) 13:11:58 ID:???]
そうですか

557 名前:555 [2009/09/27(日) 15:20:08 ID:???]
どうやればいいか知恵を貸してください

558 名前:nobodyさん mailto:sage [2009/09/27(日) 16:41:20 ID:???]
環境は?

559 名前:nobodyさん [2009/09/27(日) 16:49:26 ID:???]
perlでもrubyでも
できるだけトリッキーでなくて普通の正規表現のパターンマッチと置換でできる範囲で

560 名前:nobodyさん mailto:sage [2009/09/27(日) 23:10:15 ID:???]
絶対正規表現だけで書かなきゃだめなの?
普通に関数作る方が現実的だと思うけど

561 名前:nobodyさん mailto:sage [2009/09/28(月) 01:47:40 ID:???]
if使って分岐させれば

562 名前:nobodyさん mailto:sage [2009/09/28(月) 08:53:02 ID:???]
正規表現をかじったけどちゃんと理解するにいたってない人は
正規表現でやるとかえって面倒な事までさせようとしていらない
苦労をする傾向があるね。理解しちゃえば使った方がいいかどうか
判断つくようになるんだが。

563 名前:nobodyさん mailto:sage [2009/09/28(月) 10:18:45 ID:???]
>>555
こんなのとか?

html = str.sub(/(.+?)(:)(\d+)\n(.+?)(:)(\S+)/) {
"#{$1}#{$2}<font color=\"red\">#{$3}</font>\n#{$4}#{$5}<font color=\"blue\">#{$6}</font>"
}



564 名前:nobodyさん mailto:sage [2009/10/06(火) 22:32:03 ID:???]
phpのpreg_matchなのですが
文字列の中のURLからホストを取得するのは解るのですが
ホスト名とその後に続くディレクトリ名を取得する方法を教えて下さい。

$url = "hogehoge.com/hoge/index.php";

これならば
hogehoge.com/hogeの部分です。

お願いいたします。



565 名前:nobodyさん [2009/10/13(火) 11:08:03 ID:8X+N74J6]
phpで、いくつか特定の拡張子を持つファイルをマッチさせたいのですが、
最後を意味する$は下記のように最終的に1つでよいですか

if (preg_match("/\.html|\.php|\.txt$/",$value)) {
$chk = 1;
}

それともこのように全部に$が必要ですか?

if (preg_match("/\.html$|\.php$|\.txt$/",$value)) {
$chk = 1;
}

566 名前:nobodyさん mailto:sage [2009/10/13(火) 11:28:58 ID:???]
>>564
parse_url使うか"/(.*)\//"

>>565
やってみればわかることだけど当然全部に必要
だから\.(html|php|txt)$みたいに括弧でくくるのが常套だけどマッチした値を取得する必要ないなら
\.(?:html|php|txt)$と書いて少し軽くできる

567 名前:565 [2009/10/13(火) 12:34:51 ID:8X+N74J6]
>>566
ありがとうございました( ^ω^)

568 名前:nobodyさん mailto:sage [2009/10/14(水) 08:58:15 ID:???]
perl で,
「<と>で囲まれた文字列内の abc を def に全て置換する」
というのは正規表現でどう書けばよいでしょうか。

マッチだけならば
"<asaabcasalaabca>" =~ /\<(.*?)(abc(.*?))*?\>/
のようにしてマッチさせられるのですが,繰り返しがあるので後方参照で取得できません。

569 名前:nobodyさん mailto:sage [2009/10/14(水) 09:18:20 ID:???]
>>568
せっかくperlでプログラム書けるんだから、

1. 「<」と「>」に囲まれた文字列を取り出す
2. 1で取り出した文字列のabcをdefに置換
3. 2の結果を「<」「>」で挟む

とやれば難しいことは何もない。

570 名前:568 [2009/10/14(水) 10:26:28 ID:6OWMkMrw]
>>569
いや,確かにおっしゃるとおりなのですが,
Perl互換の正規表現を採用しているエディタで文章を打っているときに,
いちいち使い捨てのPerlスクリプトを作るのが面倒で,
せっかくエディタに内蔵されている正規表現置換機能で置換できれば便利なのにな……と思った次第です。

571 名前:nobodyさん mailto:sage [2009/10/14(水) 10:46:05 ID:???]
そりゃそのエディタの説明書に書いてあるだろ

572 名前:nobodyさん mailto:sage [2009/10/14(水) 16:45:59 ID:???]
「< と > で囲まれた文字列内のある一つの abc を def に置換する」を、
そのエディタのキーボードマクロ機能で繰り返し適用すればよくね?

573 名前:nobodyさん mailto:sage [2009/10/14(水) 17:59:48 ID:???]
いや、そのエディタに正規表現での置換機能もあるだろ、普通



574 名前:nobodyさん mailto:sage [2009/10/14(水) 18:10:49 ID:???]
置換というか補完じゃね?

575 名前:572 mailto:sage [2009/10/14(水) 18:34:24 ID:???]
>>573
エディタの置換機能だと複雑なことができない (この場合 < と > の間を繰り返し置換)
からどうすればいいの?っていう質問だと思ったんだが、違うのかな?

どのエディタ使ってるとか晒してくれるともっと的確に答えれる香具師がいそうだが。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<179KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef