正規表現 Part7
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/03/19(金) 15:16:48質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。
【 前スレ 】 正規表現 Part6
http://pc12.2ch.net/test/read.cgi/tech/1241537764/
0232277
2010/05/22(土) 01:36:41(*・∀・)ノこんばんわ。
レスありがとうございます。
quotemetaはPerlでしか使えないのか〜(´・ω・`)と思っていたら、
メタ文字のエスケープ関数のサンプルが載っているサイトがありました。
//追加
function quote(str){
return str.replace(/\W/g, function($0){
return '\\' + $0;
});
};
//変更
var w = new RegExp( quote(words[i]), "gi" );
これで出来ました!
夜遅くにどうもありがとうございました!
0233デフォルトの名無しさん
2010/05/28(金) 22:43:12どれだけ無駄になりますか?とてつもなく無駄ですか?微々たるものですか?
0234デフォルトの名無しさん
2010/05/28(金) 22:52:06グローバルフラグをつけさえしなければ、
最初のマッチング位置以降の文字列は読み込まないので。
ただし、検索対象の文字列の中にマッチングする対象が無い場合は
グローバルフラグをつけた場合と同じぐらいコストがかさむ。
もう作っちゃったなら、性能問題出てから考えたら。
0235デフォルトの名無しさん
2010/05/28(金) 22:55:32どうもありがとうございます。特に何も感じなかったら気にしないことにします
0236デフォルトの名無しさん
2010/05/29(土) 02:17:39C# 3.0
●検索か置換か?
検索
●説明
各行の1番目のAまでを検索したい
{ と } に囲まれた文字列を検索したい
●対象データ
Memo[0]{
[Text] 対象データ
}
●希望する結果
[Text] 対象データ
よろしくお願いします
0237デフォルトの名無しさん
2010/05/30(日) 10:50:00亀レスだけど、
\(.*\)
で最長一致検索すれば、一番外側の()である
(い(う)え(おか)き)
にマッチする
ちなみに、\(.*?\)で最短一致検索すれば
"(い(う)"と"(おか)"の2箇所にマッチする
0238デフォルトの名無しさん
2010/06/01(火) 00:04:430239デフォルトの名無しさん
2010/06/01(火) 00:13:50/(\d+?)/g
とかやると切ないことになる
0240デフォルトの名無しさん
2010/06/01(火) 00:29:590241デフォルトの名無しさん
2010/06/01(火) 00:43:240242デフォルトの名無しさん
2010/06/01(火) 01:31:280243デフォルトの名無しさん
2010/06/01(火) 08:06:13ttp://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
0244デフォルトの名無しさん
2010/06/01(火) 12:12:440245デフォルトの名無しさん
2010/06/04(金) 10:32:38aiueo
aiue
iueo
にはマッチするけどiueにはマッチしないってどう書けばいいですか?
/a?iueo?/
だとiueにもマッチしてしまって
/a?iueo|aiueo?/
だと期待通りにはなるのですが
重複する記述があるのでまとめられるならまとめたいです
共通する部分がiueじゃなくてもっと複雑になった場合など
0246デフォルトの名無しさん
2010/06/04(金) 11:08:31自己レスです
/a?(iue)o|a\1o?/
こうかな・・・
0247デフォルトの名無しさん
2010/06/04(金) 12:26:17僕もそう思った。
0248デフォルトの名無しさん
2010/06/06(日) 10:57:14javascriptです。
IMG00123123.jpgというような文字列が配列に大量にある。
そんな中で、例えばIMG00000012.jpgを検出したい。
そのものずばりで検索すれば、何も問題はないのですが、
不精をして、12だけで、マッチさせたい場合、どう考えればよいでしょう?
0249デフォルトの名無しさん
2010/06/06(日) 11:13:15("00000000" + "12").substr("12".length);
0250デフォルトの名無しさん
2010/06/06(日) 12:06:300251デフォルトの名無しさん
2010/06/06(日) 12:15:14ありがとうございます。
後ろから検索する事と、
文字列の長さを利用して、
"00000000"と"12"を分割する、という考え方ですね。
ちょっと検証してみます。
0252デフォルトの名無しさん
2010/06/06(日) 12:55:22あ、ありがとうございます。
現在>>249の考え方で検証中です。。
str:検索対象の文字列(ファイル名)例:IMG012312.jpg
a:検索の為の入力された数値 例:12
c=str.lastIndexOf(a+".")
if(c>-1)
{
d=str.slice(0,c);
e=(d.match(/[1-9]/).length
if(e>0)
{
alert("strは、00000012.jpgではない");
}else{
alert("strは、00000012.jpgだ");
}
おおよそこんな処理になるでしょうか?
0253デフォルトの名無しさん
2010/06/06(日) 13:06:180254デフォルトの名無しさん
2010/06/06(日) 14:13:08エラーだらけですみません。デバッグしてませんでした。
str="IMG001012.jpg ";
a=12;
c=str.lastIndexOf(a+".jpg") ;//後方から"12.jpg"で検索
//引っかかれば、12.jpgの部分がある
//なければ-1が帰ってくる
if(c>-1) {
//検索に引っかかった場合次は、
//文字列strの0番からc-1番までが、
//0以外の文字を含むか検証する必要がある
d=str.slice(0,c); //strの0番からc-1番までを抜出し変数dに代入
//文字列dの中に1から9の任意の値がなければnullが帰ってくる
//strは少なくとも12.jpgではないと言えるので
if((d.match(/[1-9]/g))==null)
{
alert("12.jpgの候補だ");
}else{
alert("12.jpgではない");
}
}
こんな感じで絞り込めました。
後は、imgとかの違いや、0の数での違いをどう処理するかかなと
思いますが、、
0255デフォルトの名無しさん
2010/06/06(日) 14:18:33誤//strは少なくとも12.jpgではないと言えるので
正//strは少なくとも複数の0と12.jpgからなる文字列だといえるので
0256デフォルトの名無しさん
2010/06/06(日) 15:07:04n=Number("IMG00000012.jpg".match(/\d+/)[0]);
alert(n);
で検証しました。確かに12ですね。
\d+:任意の数値の1回以上の表現
これで、00000012が配列として抽出される
で、問題は[0]ですが、
これは、もしかして配列の0番ということですか?
こんな使い方が出来るとは知りませんでした。
この手法だと、直接値を比較できますね。
ありがとうございました!!
0257デフォルトの名無しさん
2010/06/06(日) 15:50:34https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/String/match
>正規表現が g フラグを含んでいない場合、regexp.exec(string) と同じ結果を返します。
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/exec
>[0] 最後にマッチした文字
配列じゃなくてプロパティ
厳密には配列もプロパティの集まり
つーかjsスレ(ry
0258デフォルトの名無しさん
2010/06/06(日) 16:42:14すみませんでした(平謝り)
上記リファレンス、頭から読み直します。
ありがとうございました。
0259デフォルトの名無しさん
2010/06/11(金) 23:05:13●正規表現の使用環境 - Mery(エディタ、鬼車ライブラリ)
●説明 - 連続する同じ内容の2行にマッチ、3行以上の部分にはマッチさせない
●対象データ
ABCD
ABCD
EFGH
EFGH
EFGH
●希望する結果
ABCDの2行のみマッチ、EFGHの2行のところ(2箇所)はスルーして欲しい。
---
否定先読みと否定戻り読みを同時に使ってみたところ、
たぶん否定戻り読みの\1の参照が変なため上手くいきませんでした。こんな感じ。
(?<!\1)(^.+\n)\1\1(?!\1)
0260259
2010/06/11(金) 23:08:36すみません。例では「\1」が1個多すぎました。
× (?<!\1)(^.+\n)\1\1(?!\1)
○ (?<!\1)(^.+\n)\1(?!\1)
…どっちみちダメな例ですが、いちおう。。
0261デフォルトの名無しさん
2010/06/12(土) 04:20:30鬼車では>>259の問題は解けないと思う。
こういう前方からの参照ができる正規表現エンジンってあるの?
0262デフォルトの名無しさん
2010/06/12(土) 10:25:24どうか俺もわからん)けど、そういう行を抽出したいだけなら前の1行も
マッチさせてしまえばいいんじゃね?
$str = <<__STR__;
ABCD
ABCD
EFGH
EFGH
EFGH
__STR__
$re = qr{
(?:
¥A
|
(^.+¥n)
(?!¥1)
)
(
(^.+¥n)
¥3
)
(?!¥3)
}xsm;
while ($str =~ /$re/g) {
print "<<<¥n$2>>>¥n"
}
0263259
2010/06/12(土) 13:32:11どうもありがとう! それで上手くいきました。
が、便乗ですみませんが、よろしければもう1つ質問させてもらえますか。
>>262の非捕獲式集合 "(?:)" を消そうと思うと上手くいきません。
"(?:)" を"()" に変え、 後方参照が1つ増えたので、"\3" を "\4" に変えると
同じものになるはずだと思うのですが。。
○ (?:\A|(^.+\n)(?!\1))((^.+\n)\3)(?!\3)
× (\A|(^.+\n)(?!\1))((^.+\n)\4)(?!\4)
0264259
2010/06/12(土) 13:43:31cf.
無理矢理ほんの少しだけ見やすくしてみました。
○ --- (?: \A|(^.+\n)(?!\1) ) ( (^.+\n)\3 ) (?!\3)
× --- ( \A|(^.+\n)(?!\1) ) ( (^.+\n)\4 ) (?!\4)
0265デフォルトの名無しさん
2010/06/12(土) 14:03:180267デフォルトの名無しさん
2010/06/13(日) 09:25:15というのを試してみたら可変長戻り読みでエラーになっちゃった。
これ戻り読みするときには¥2は確定してるんだからなんとかならん
のかなぁ。
0268デフォルトの名無しさん
2010/06/17(木) 03:14:38/aaa/ ・ /aaa bbb/ と2回やるのと、/aaa( bbb)[0,1]/ とまとめるのでは、
一般的に言ってどっちが速い・軽い・負担少ないの?
対象データとの兼ね合いもあるだろうが、どっちの方が好ましいの?
0269デフォルトの名無しさん
2010/06/17(木) 03:18:1210万回くらい回すテストプログラム作ってみたらいいと思う。
あと、/aaa( bbb)[0,1]/じゃなくて/aaa( bbb){0,1}/ね。
もっと言うと/aaa( bbb)?/の方が簡潔。
0270デフォルトの名無しさん
2010/06/17(木) 03:19:36×: /aaa( bbb)[0,1]/
○: /aaa( bbb){0,1}/
0271デフォルトの名無しさん
2010/06/17(木) 03:21:17>/aaa( bbb)?/
なるほど!
0272デフォルトの名無しさん
2010/06/19(土) 15:08:05use utf8;
use encoding "cp932";
use encoding 'euc-jp';
use encoding "iso-8859-2";
などの文にマッチして、「utf8」「cp932」「euc-jp」「iso-8859-2」の部分のみ取り出したいのですが
一発でできる方法があったら教えてください。
0273デフォルトの名無しさん
2010/06/19(土) 15:11:49アルファベット+数値.jpgのパターンはうまく認識するコードができました。
ただ新たな問題も発生しました。以下のようなパターンです。
日本語の文字化けと、スペースがあるパターンでは、数値を正確に拾えませ
んでした。
画像_000012.pg
%E7%94%BB%E5%83%8F_000012.jpg
画像 000012.jpg
%E7%94%BB%E5%83%8F%20000012.jpg
画像 000012.jpg
%E7%94%BB%E5%83%8F%E3%80%80000012.jpg
文字化け部分を無視して、数字の部分だけを検出する方法を得たいのですが
どうしたらよいでしょうか?
日本語とスペースの部分は(%..)*と、まとめられますが
これを除いた数値部分\d+だけをマッチの対象としたい場合
以下の表現でよいでしょうか?
(?:(%..)*)\d+
0274デフォルトの名無しさん
2010/06/19(土) 15:19:55| を使えばまあ1つにはできるだろうけど
0275デフォルトの名無しさん
2010/06/19(土) 21:03:30^use\s+(encoding\s+)(?(1)["']|)(.*?)\2;$
こうですか?分かりません><
0276デフォルトの名無しさん
2010/06/23(水) 05:14:30秀丸 または AHK
●検索か置換か?
検索 / grep
●説明
テキストファイルを複数キーワードで検索したい
(通常のウェブ検索のようなものを正規表現で行いたい)
●対象データ
text1 [tag1][tag2]
text2 [tag2][tag1]
text3 [tag2]
text4 [tag3][tag1]
text5 [tag3]
text5 [tag1][tag3][tag2]
●希望する結果
[tag1] および [tag2] で検索した場合、以下がヒット
text1 [tag1][tag2]
text2 [tag2][tag1]
text5 [tag1][tag3][tag2]
0278デフォルトの名無しさん
2010/06/23(水) 09:06:030279デフォルトの名無しさん
2010/06/23(水) 09:50:32>>276
(?=.*\[tag1\])(?=.*\[tag2\])
ただ秀丸の正規表現が先読みに対応してないと動かない
0280デフォルトの名無しさん
2010/06/25(金) 00:09:27ありがとうございます。試してみたところ、秀丸では動きませんでした。
先読みには対応しているようなので、何か別の工夫がいるのかもしれません。
秀丸スレで質問してみます。
0282デフォルトの名無しさん
2010/06/25(金) 17:47:50(?=.*\[tag1\])(?=.*\[tag2\])
でも
^(?=.*\[tag1\])(?=.*\[tag2\])
で動いたぞ。ただ、実際に0文字にマッチしているので、
範囲としては見えない。分かりやすいのがよければこれだな:
^(?=.*\[tag1\])(?=.*\[tag2\]).*
0283デフォルトの名無しさん
2010/06/27(日) 22:26:13VBScript
●検索か置換か?
置換
●全角英数字を全て半角英数字にしたい
1文字1文字Case文でそれぞれを置換するしか方法ないですかね?
0284デフォルトの名無しさん
2010/06/28(月) 18:11:550285デフォルトの名無しさん
2010/06/28(月) 18:17:06あと死んでください。
Excel VBA 質問スレ Part15
http://pc12.2ch.net/test/read.cgi/tech/1271261239/692
0286デフォルトの名無しさん
2010/06/29(火) 19:29:23Perl
●検索か置換か?
置換
●説明
文章の全部のurlを下記のように”&”のあとを削除したい
●対象データ
ttp:\\www.example.com\c?ro=1&act=rss&output=no
......
●希望する結果
ttp:\\www.example.com\c?ro=1
......
0287デフォルトの名無しさん
2010/06/29(火) 20:53:290288デフォルトの名無しさん
2010/06/29(火) 21:04:220289デフォルトの名無しさん
2010/06/30(水) 12:21:22\fで区切ってたんだけど、要素が10以上になるとうまく指定できない……
0290デフォルトの名無しさん
2010/07/01(木) 18:35:230291デフォルトの名無しさん
2010/07/04(日) 23:25:25JavaScript
●検索か置換か?
置換
●説明
「サーバー」を「サーバ」に置換したい
「サーバーサイド」「サーバー設定」は除外したい
●対象データ
つまりサーバーのあれこれ
しかしサーバーサイドのなんたら
なお、サーバー設定は云々
●希望する結果
つまり、サーバのあれこれ
しかしサーバーサイドのなんたら
なお、サーバー設定は云々
0292デフォルトの名無しさん
2010/07/04(日) 23:59:32.replace(/サーバー(?!(サイド|設定))/g,"サーバ")
0293デフォルトの名無しさん
2010/07/05(月) 08:15:02そうです。ありがとうございました!
梟で勉強します!
0294デフォルトの名無しさん
2010/07/05(月) 14:04:370295デフォルトの名無しさん
2010/07/05(月) 15:59:11こういう皮肉を言う人間にはなりたくないな。
0296デフォルトの名無しさん
2010/07/05(月) 16:37:34おれも >>291 にはクックブックの方がいいと思うけど。
0297デフォルトの名無しさん
2010/07/05(月) 18:12:56このスレの質問は、初心者ばかりだから、梟じゃわけわからんことが多いだろう。
0298293
2010/07/05(月) 19:29:54梟本は持ってるんですが、確かに難解で中々身についてる感じがしないです
専門書と言うか辞書を読んでる感覚で頭で分かったつもりになるだけと言うか…
料理本、よろしければURLか正式タイトル教えて頂けませんか?
0299デフォルトの名無しさん
2010/07/05(月) 20:09:02http://www.oreilly.co.jp/books/9784873114507/
いろんな実例が載ってるから便利でいいと思うよ。
0300298
2010/07/05(月) 20:53:05買いました!
これのが易しそうですね
ありがとうございます
皆さんはハンドブックやクイックリファレンスみたいなの持ってますか?
0301デフォルトの名無しさん
2010/07/05(月) 22:33:53料理本も他人に推奨しながらまだ買ってないし、梟も2版だけどね。
3版で2版にない良いところがあったら教えてほしいとこr。
0302デフォルトの名無しさん
2010/07/05(月) 22:37:51難解とかいう以前に読んでないんだろう
0303デフォルトの名無しさん
2010/07/06(火) 23:49:53●正規表現の使用環境
JavaScript
●検索か置換か?
置換
●説明
「チョコレート」を「チョコ」に置換したいです
でも「板チョコレート」「バレンタインチョコレート」はヒット(置換)させたくないです
●対象データ
やはり板チョコレートよりも
バレンタインチョコレートよりも
自分で買うチョコレート!
●希望する結果
やはり板チョコレートよりも
バレンタインチョコレートよりも
自分で買うチョコ!
(!(バレンタインチョコレート|板チョコレート)チョコレート),チョコ/g
…ダメです。やっぱ難しいです。
0304デフォルトの名無しさん
2010/07/07(水) 00:04:270305276
2010/07/07(水) 00:36:58>>282 さんがおっしゃる通りでした。0 文字マッチで動いてたんですね。
結局最後のものを使わせていただきました。
ありがとうございました。
0306303
2010/07/07(水) 12:28:01上手くいきません
「<」って、どう言う意味なんですか?
0307デフォルトの名無しさん
2010/07/07(水) 13:14:470308デフォルトの名無しさん
2010/07/07(水) 14:08:25JavaScriptは戻り読み使えないのか。ごめん
(?<!...) で否定の戻り読み。「左に"板"も"バレンタイン"もない"チョコレート"」って意味
これならどうだろ
var s = "やはり板チョコレートよりも\nバレンタインチョコレートよりも\n自分で買うチョコレート!";
s..replace(/(板|バレンタイン)?チョコレート/g, function(str, p0){ return p0 ? str : 'チョコ'});
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Guide/Regular_Expressions
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
0309デフォルトの名無しさん
2010/07/07(水) 17:39:20それぞれひとつひとつを全て検索対象にする
(連続したものをひとまとまりとして扱うのではなく。そして文中のスペースは対象にしない)
には、どう書けばいいですか?
0310デフォルトの名無しさん
2010/07/07(水) 18:33:140311デフォルトの名無しさん
2010/07/07(水) 18:46:200312309
2010/07/07(水) 19:30:22でも実際自己解決しました
解決って、その通りのことができたわけじゃないんだけど
やろうとした目的は果たせたんで、おkとします
>>310さん、せっかくすばらしい人間性を披露してくださったのに
あなたがワクワク期待してたような反応してあげられなくて、ごめんなさい
0313デフォルトの名無しさん
2010/07/07(水) 19:34:210314デフォルトの名無しさん
2010/07/08(木) 09:42:56動かないっす(;´Д`)
ブラウザはFF
JavaScriptに限らずVBscriptでも動けばいいと思ったんですが
厳しそうですね…
これって、やろうとしてる事は前方参照否定になるんですかね?
0315デフォルトの名無しさん
2010/07/08(木) 13:16:00x s..replace
o s.replace
0316デフォルトの名無しさん
2010/07/08(木) 17:54:33PHP5
●検索か置換か?
検索
●説明
[[ と ]] に囲まれた文字列を配列で取得したい
●対象データ
[[hare]][[ame]][[kumori]][[yuki]][[]][[kaminari]][[taifuu]]
●希望する結果
matches[0] = hare
matches[1] = ame
matches[2] = kumori
matches[3] = yuki
matches[4] =
matches[5] = kaminari
matches[6] = taifuu
よろしくお願いします。
0317デフォルトの名無しさん
2010/07/09(金) 07:36:38これってどんな人がどんな時に使うんでしょうか?
ぐぐって調べてもイマイチ意味が分かりませんし
いったいどんな人が使ってるのか疑問です。
自分みたいにパンピーは知らなくても無問題でしょうか?
0318314
2010/07/09(金) 08:25:23ありがとう!
でも正規表現だけだと、無理って事?
>>317
君は知る必要ないね
一般事務職でも使うケースはあるけど
ワイルドカードだけ取り敢えず覚えておいては?
と、正規表現初心者の俺が(ry
0319デフォルトの名無しさん
2010/07/09(金) 10:43:04ワイルドカード(*、?だけですけど)の使い方は分かってます。
0320デフォルトの名無しさん
2010/07/09(金) 11:22:26出会ってもないのに知る必要はないと思う。
0321デフォルトの名無しさん
2010/07/09(金) 15:36:10怖いお兄さん(お姉さんも可)に怒られるからよい子は注意な
0322デフォルトの名無しさん
2010/07/09(金) 18:26:02ここで正規表現って騒いでるやつも知らないから。
その証拠にワイルドカードぐらいしか言えないだろ?w
0323デフォルトの名無しさん
2010/07/09(金) 20:39:020324名無しさん@そうだ選挙に行こう
2010/07/10(土) 09:01:52これってどんな人がどんな時に使うんでしょうか?
ぐぐって調べてもイマイチ意味が分かりませんし
いったいどんな人が使ってるのか疑問です。
自分みたいにパンピーは知らなくても無問題でしょうか?
0325名無しさん@そうだ選挙に行こう
2010/07/10(土) 09:03:32これってどんな人がどんな時に使うんでしょうか?
ぐぐって調べてもイマイチ意味が分かりませんし
いったいどんな人が使ってるのか疑問です。
自分みたいにパンピーは知らなくても無問題でしょうか?
0326名無しさん@そうだ選挙に行こう
2010/07/10(土) 18:51:05これってどんな人がどんな時に使うんでしょうか?
ぐぐって調べてもイマイチ意味が分かりませんし
いったいどんな人が使ってるのか疑問です。
自分みたいに頭がクラウドな香具師は知らなくても無問題でしょうか?
0327名無しさん@そうだ選挙に行こう
2010/07/10(土) 20:53:00っつーかスレ違い
0328名無しさん@そうだ選挙に行こう
2010/07/10(土) 21:49:10モバイル アプリケーションまで対応できる高い信頼性を備えた
アプリケーションを構築することができます。
正規表現で企業内に存在する多数のデータを統合し、全社員がデータを活用できる
ビジネス インテリジェンス基盤として堅牢で実績のあるハイパーバイザーを構築し
不要なリスクやオーバヘッドを回避できます。
正規表現の仮想インフラストラクチャ機構にはデータを安定して管理するさまざまな機能はもちろん、
データを活用・分析する機能まで、すべての機能がオールインワンで備わっているます。
高いスケーラビリティとバランスのとれたトータルクオリティーを活用することにより
あなたの快適ライフをサポートします。
0329名無しさん@そうだ選挙に行こう
2010/07/10(土) 21:58:550330名無しさん@そうだ選挙に行こう
2010/07/11(日) 09:29:54ユーのランゲージはファンタスティックね
0331名無しさん@そうだ選挙に行こう
2010/07/11(日) 10:15:52■ このスレッドは過去ログ倉庫に格納されています