1 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 00:36:04 ] 正規表現(Regular Expression)スレです。 質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。 【 前スレ 】 正規表現 Part5 pc12.2ch.net/test/read.cgi/tech/1212498448/
548 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:09:38 ] ●正規表現の使用環境 VB.NET ●検索か置換か? 検索 ●説明 htmlタグの外にある文字を取得したい ●対象データ <hoge hoge hoge hoge> <hoge> <hoge> <hoge hoge hoge> あいうえお <hoge hoge> <hoge hoge hoge hoge hoge> ●希望する結果 あいうえお 対象のデータの中にはタグの外の文字列は1箇所(1行)しかありません。 何行目にあるかは不明です。 お願い致します。
549 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 01:24:47 ] >>548 説明からするとサンプルのようにきれいに揃っていそうだし "<"で始まらない行を抽出(もしくは始まる行を削除)で十分かもしれない VB.netは知らないから具体例はパス
550 名前:544 mailto:sage [2009/10/27(火) 02:03:55 ] すみません。処理系はC#です。 否定先読みという機能を勉強したところ、C#の正規表現にも先読みは あったので、これで実現することができました。ご教授有難うございました
551 名前:デフォルトの名無しさん mailto:sage [2009/11/01(日) 11:23:38 ] javascript 抽出 1回では難しそうなので2回に分けてやっているのですが str=str.match(処理1) str=str.match(処理2) とやるとうまくいきません 下がないと処理1はできます このやり方では何か問題があるのでしょうか?
552 名前:551 mailto:sage [2009/11/01(日) 15:39:34 ] 一応自己解決しました 過去のスクリプトを見直していたところ matchで検索してからsubstringで抜き出していて 試したところうまくいきました どうも失礼しました
553 名前:デフォルトの名無しさん [2009/11/03(火) 13:13:35 ] おめでとう
554 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 01:43:16 ] ●正規表現の使用環境 秀丸 ●検索か置換か? 置換 ●説明 文字列Higを含むが、Highでない文字列を置換 ●対象データ Hig123 HigABC HighScore ●希望する結果 Hig123 ^^^ HigABC ^^^ HighScore お願いします。
555 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 01:52:43 ] マッチ部分はHigだけでいいの? Hig(?!h)
556 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 02:09:08 ] できました、ありがとうございます。 理解できないところがあるので、迷惑でなければ教えてください。 ?の効果は、直前のパターンが0回または1回です。 しかし、直前の文字は記号なのでエラーになるように見えます。 現に*や+ではエラーになります。 ?はどんな動作をしているのでしょうか?
557 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 02:22:40 ] >>555 のこと? (?!pettern)は否定先読みという構文で、その?とは異なる意味
558 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 02:27:13 ] 555のこと言ってるんなら?じゃなくて (?!expression) 後方不一致指定でしょ
559 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 02:29:26 ] 理解できました。 ありがとうございます。
560 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 23:04:00 ] PHP5で文字コードはEUCです。 全角半角が混ざった文字列の中から、@******という部分を取り出したいと思っています。 ・@の前にはどんな文字があってもいい ・******は半角英数とアンダーバー(_)が使える ・******の後ろにスペースか全角文字かアットマーク(@)が付いたら終わり という条件で取り出したいのですが、うまくいきません。 @\w+[^ ][\x01-\x7E] では無理でした。 どのような式を書けばいいのでしょうか?
561 名前:560 mailto:sage [2009/11/08(日) 23:10:48 ] 具体的には、 こんにちは@Abc_123@Def_456 今日はいい天気 を、 こんにちは[hoge][hoge]今日はいい天気 に置換したいって事です
562 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 01:21:51 ] >>560 @[_\w]+ でいいんじゃない?
563 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 02:50:08 ] >>562 \w には _ も含まれてるとおも。
564 名前:560 mailto:sage [2009/11/09(月) 17:24:29 ] >>562 >>563 ありがとうございます。@[\w]+で出来ました。 まだまだ正規表現は初心者ですが、流石にこれが出来ないのは情けない・・・・・・・
565 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 17:26:42 ] @\w+ でおk
566 名前:デフォルトの名無しさん mailto:sage [2009/11/11(水) 23:08:14 ] ●正規表現の使用環境 VB.NET ●検索か置換か? 検索 ●説明 拡張子をtxt,jpg,gifなど複数の種類を指定してURLを検索したい ●対象データ http:****/****/****/12345.jpg http:****/****/****/12345.exe http:****/****/****/12345.gif http:****/****/****/12345.txt http:****/****/****/12345.bmp ●希望する結果 http:****/****/****/12345.jpg http:****/****/****/12345.gif http:****/****/****/12345.txt 現在 [\w\d/%#$&? ()~_.=+-]+\.jpg jpgの場合は上記のように書いてありますが、別の拡張子を追加していくにはどうやって書けばよいでしょうか? [\w\d/%#$&? ()~_.=+-]+\.jpg|gif だと、 http:****/****/****/12345.jpg と g にヒットするのですが、[jpg|gif] [(jpg)|(gif)]やURLの部分をカッコで囲んだりしてみましたがだめみたいです。 [\w\d/%#$&? ()~_.=+-]+\.jpg|[\w\d/%#$&? ()~_.=+-]+\.gif ・・・・・・・ と書けば良いのですが、長くなってしまいます。 拡張子だけを書き足す方法があれば教えていただけないでしょうか。
567 名前:デフォルトの名無しさん mailto:sage [2009/11/11(水) 23:17:11 ] \.(jpg|gif)
568 名前:デフォルトの名無しさん mailto:sage [2009/11/11(水) 23:24:08 ] できましたー ありがとう。 でもこれ試した気がしたんだが・・・
569 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 07:24:52 ] 性器表現
570 名前:デフォルトの名無しさん mailto:sega [2009/11/12(木) 22:18:10 ] $hoge = "0123456789ABCDEF012"; $hoge =~ s/.*?([0-9A-F]{16}).*?/$1/i; print $hoge; とにかく16進ぽい文字列を16文字で切り出したいので 上みたいに書いたんだけど、切り出せません。 どこが間違ってるかわからないので助けて
571 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 22:42:35 ] $hoge = "0123456789ABCDEF012"; $hoge =~ /([[:xdigit:]]{16})/; print $1, "\n";
572 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 22:43:43 ] $hoge = "0123456789ABCDEF012"; $hoge =~ s/.*?([0-9A-F]{16}).*?//i; print $hoge; print $1; としてみりゃ原因わかるんじゃね? ?外して文頭文末明示すればおk
573 名前:デフォルトの名無しさん [2009/11/14(土) 17:16:59 ] 「秀丸エディタ」の正規表現の置換がうまくいきません。 作業内容は、 (1)Excelで作成した表を、タブ区切りのテキストデータとして保存し、 (2)「秀丸エディタ」でそのテキストデータを開き、 ^(先頭文字)⇒¥t¥t¥t に全置換しようとしました。 もともとテキストデータであったファイルを置換するときはうまくいきますが、 Excelからエクスポートしたテキストデータは、先頭行を認識してくれないのでしょうか。 どうすれば、先頭行を置換できるでしょうか。 よろしくお願いいたします。
574 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 01:24:50 ] 先頭文字なのか 先頭行なのか どっちかハッキリしろ
575 名前:デフォルトの名無しさん [2009/11/15(日) 10:10:28 ] >>574 先頭文字です。 Excelからエクスポートしたテキストに対して^がないと言われてしまうんです。
576 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 11:33:20 ] マルチラインの問題とみた。 マルチライン有効になってる?
577 名前:デフォルトの名無しさん [2009/11/16(月) 00:48:19 ] >>576 ありがとうございます。 マルチラインの設定は秀丸側の設定ですか? それともExcelでしょうか? 初心者ですみません。 早く秀丸を使いこなさないと、ソース書くときに便利なのにもったいないですね。
578 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 12:20:02 ] >>577 そんなのどんな初心者でも人間なんだから 「マルチライン 秀丸」と「マルチライン Excel」で検索かけたり、設定見れば大体予想は付くと思うが、 少しは自分の手、動かした方がいいぞ、反感買うから
579 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 12:27:26 ] パソコン買ったら最初に覚えること。 それは 検索 だ!
580 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 12:28:49 ] まさか、「□正規表現(R)」 をチェックしてないとかいうオチじゃないだろうな
581 名前:デフォルトの名無しさん [2009/11/19(木) 07:06:23 ] >>577 です。 皆さんありがとうございます。 マルチライン、秀丸、excel、テキストなどで検索したのですが、 どこでマルチラインの有効無効をセットできるのか分かりません。 エクセルの各々のセルは、セル内改行を認めていません。 教えていただけないでしょうか。 よろしくお願いいたします。
582 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 07:43:49 ] >>575 > Excelからエクスポートしたテキストに対して^がないと言われてしまうんです。 >>580 は?
583 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 07:45:52 ] 念のために書いておくと 置換の時に出てくるダイアログに>>580 のチェックボックスがある
584 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 09:31:15 ] 任意の1文字(なくてもOK)ってのはどうやるの? 「.*」だと文字数制限ないし...
585 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 09:43:31 ] 一般的には(|.)かな。perl互換なら.?
586 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 09:47:17 ] .+
587 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 10:06:15 ] 改行と空白(全角&半角)以外すべての文字って一気には表現できない?
588 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 10:42:56 ] [^\n\s]+ 改行またはホワイトスペース(半角スペースとTAB含む)以外の1文字 (改行もホワイトスペースだから複数行対象のときは\n不要かもね) [^\n\s ]+ 全角スペースは文字コードにもよると思うので処理系依存かな
589 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 18:44:49 ] >>584 .?
590 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 01:22:54 ] >>587 なんで >>1 を読まないかな?
591 名前:デフォルトの名無しさん [2009/11/21(土) 08:57:37 ] >>583 そこはチェックを入れています。 別のcsvで試したら、1行目のタイトル行だけ先頭行を認識し、2行目からのデータ行の先頭行は認識しませんでした (T_T)。
592 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 09:31:53 ] だから、マルチラインがtrueになってないんだろ。
593 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 09:37:18 ] どうもやりたいことがよくわからんな
594 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 09:55:04 ] 困ってるという割にのんびりしてるな そういう独自の用語じゃなくて どういうデータをどうしたいのか具体的に書いて 秀丸スレでもう一度聞いたほうがマシな気がする
595 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 10:51:27 ] マルチラインが無効になってりゃ、改行記号が無視されるんだから、 先頭以外の改行は改行とみなされないんだよ。 だから2行目以降の先頭は、先頭とみなされていない。 改行記号に続く文字列って事。 改行記号を改行記号として認識させるのがマルチライン。 マルチライン問題じゃなかったらお手上げ。
596 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 11:08:48 ] せめて >4のテンプレ埋めるくらいはしてくれんと。 Excel、秀丸共に現役バージョンが混在してるソフトなんだし 環境晒しもせず、できませんできません言われてもどうしようもない WinXPSP3 / Excel 2002(Office XP) SP3 / 秀丸8β25 (HMJRE V2.06) とりあえず↑の環境では ・Excelコピー→秀丸へペースト ・名前を付けて保存:テキスト(タブ区切り)→秀丸で開く のどちらでも問題なくできたよ。
597 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 12:28:52 ] マルチライン、マルチラインって言ってるヤツ、バカじゃねぇの?
598 名前:デフォルトの名無しさん [2009/11/21(土) 14:49:56 ] ●正規表現の使用環境 Java1.6 ●検索か置換か? 検索 ●説明 雑多な文字列からスラッシュで終わるURLを抽出したい ●対象データ 今日はabcd.efgh/abc/ でご飯を食べました そしたら12345/abc/index.html なスープが出てきてビックリ おまけにaiueo/test/xxx.img こんなデザートまで ●希望する結果 abcd.efgh/abc/
599 名前:598 [2009/11/21(土) 15:27:20 ] ●パターン (|https:// ){1}[\w\_\.\-/:\#\?\=\&\;\%\~\+]+/[^A-Za-z0-9\_\.\-/:\#\?\=\&\;\%\~] ●結果 abcd.efgh/abc/ で 最後に一文字付いてしまいます どうやって付かないようにすれば良いでしょうか
600 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:14:20 ] 否定の先読み使え
601 名前:デフォルトの名無しさん mailto:sage [2009/11/24(火) 03:17:06 ] 2 文字目以降にマッチする正規表現はどのように記述したら良いですか? 例えば "abcXdXefgXXhij" という文字列の、2番目以降全ての "X" にマッチするようなものです。 基本的そうなのですが、ちっとも思いつきませんでした。
602 名前:デフォルトの名無しさん mailto:sage [2009/11/24(火) 09:13:58 ] 2文字目以降ってのが何を指してるのかわからんな。 その例だとどれにマッチすればいいんだ?
603 名前:601 [2009/11/24(火) 09:43:31 ] >>602 すいません、いろいろ書き忘れてました。 こんな感じです。 - 使用環境: AutoHotkey 1.0.48 - 使用法: 検索 - 説明: 下記にある文字 X を、最初だけ残して残りを Y に置換したい "abcXdXefgXXhij" -> "abcXdYefgYYhij"
604 名前:デフォルトの名無しさん mailto:sage [2009/11/24(火) 09:55:19 ] AutoHotKeyならRegExReplaceで開始位置を指定できるので、 最初のXの次の文字からにすりゃいいんじゃねーの?
605 名前:601 mailto:same [2009/11/24(火) 10:14:23 ] >>604 そうでした、ありがとうございます。 こんな感じでできました。 RegExReplace(str, "X", "Y", temp, -1, InStr(str, "X") + 1)
606 名前:デフォルトの名無しさん mailto:sega [2009/11/24(火) 19:44:10 ] IPv6かどうかを調べる正規表現ってどこかにサンプルある?
607 名前:デフォルトの名無しさん mailto:sage [2009/11/24(火) 21:06:46 ] IPv6 regex でググってみるとか
608 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 00:47:05 ] IPv6 アドレスの形式チェックを正規表現でやる香具師は池沼。 getaddrinfo(3) を使え。 ってうちのじっちゃんが言ってた。
609 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 08:59:16 ] >>608 inet_ptonだろ
610 名前:606 mailto:sage [2009/11/26(木) 09:39:14 ] >>608 JavaScriptとか使って入力段階で一旦弾きたいんですだよ。 サーバ側ではinet_ptonなりなんなり別の手段で再チェックするけど。
611 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 09:47:28 ] >>610 はやくぐぐれよ www.google.co.jp/codesearch?q=IPv6+regex
612 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 10:42:06 ] >>608 いのなかのかわず
613 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 13:47:57 ] 鬼車でひいひい言わせてやるよ
614 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 23:51:33 ] >>609 inet_pton(3) のことは綺麗さっぱり忘れろ。 ってうちの itojun が言ってた。
615 名前:デフォルトの名無しさん [2009/11/27(金) 11:50:16 ] ●正規表現の使用環境 perl5 ●検索か置換か? 検索 ●説明 クォーテーションに囲まれた(省略可)の文字列を取得したい。 ●対象データ "aaa":'bbb':`ccc`:ddd:eee:666:777:888:999:000:111 ●希望する結果 $1:aaa $2:bbb $3:ccc $4:ddd $5:eee $6:666 $7:777 $8:888 $9:999 $10:000 $11:111 (["'`]*)([^\1]*)\1):(["'`]*)([^\2]*)\2):(["'`]*)([^\2]*)\2)の形式で、 後方参照が一桁の時はうまく行くんですが、二桁になると不具合がおきます。 (["'`]*)([^\10]*)\10) \10の下一桁に該当する文字(0)があるとマッチしません。 原因は[^\10]の部分が「\10以外」ではなく「\1と0以外」と解釈される為では ないかと思いますが、回避する記述方法はありますか?。
616 名前:デフォルトの名無しさん [2009/11/27(金) 12:02:52 ] 失礼しました。 (["'`]?)([^\1]*)\1:(["'`]?)([^\3]*)\3:(["'`]?)([^\5]*)\5 (["'`]?)([^\11]*)\11) $2:aaa $4:bbb $6:ccc $8:ddd $10:eee $12:666 $14:777 $16:888 $18:999 $20:000 $22:111 でしたm(__)m。
617 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 13:26:38 ] そもそも文字クラス中で\1とかは使えない罠。 [^\1]は文字コードが1の文字以外に解釈されて いると思われる。 print "match1\n" if 'aa' =~ /(.)[^\1]/; print "match2\n" if "a\001" =~ /(.)[^\1]/; print "match3\n" if 'ab' =~ /(.)[^\1]/;
618 名前:デフォルトの名無しさん [2009/11/27(金) 13:49:45 ] 1と3だけマッチしますね。「(後方参照としての)\1と0以外」と 解釈される為でも無いということですね。 確かに下一桁が該当する場合に必ず一致しないということでも なかったので、原因がわからず苦しんでました。ありがとうございます。 ^を使用して簡潔に「(二桁で指定する)後方参照の文字を含まない 文字列」は表現できないものでしょうか。
619 名前:デフォルトの名無しさん [2009/11/27(金) 14:47:01 ] クラスの中で使えないということは^で「以外」を 表現することも出来ないということですね…。 perl5なんで(?!regexp) が使えるのかな。
620 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 15:01:37 ] クォーテーションに使った文字以外と書きたくなるのはわかるが、 正規表現では書きにくいので最小マッチ.*?でいいんじゃね?
621 名前:デフォルトの名無しさん [2009/11/27(金) 15:16:04 ] 最小マッチだと文字間の区切り記号「:」を含む文字列を指定できないんです。 説明不足でした。 ●対象データ "aaa":bbb:"c:c" ●希望する結果 変数1「aaa」 変数2「bbb」 変数3「c:c」 としてマッチさせたいんですが…。
622 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 23:19:02 ] /\G(["'`])(.*?)\1(:|$)/
623 名前:デフォルトの名無しさん [2009/11/28(土) 00:53:45 ] 実現できました。ありがとう御座いましたm(__)m。 文字列数は固定なのと、クォーテーションは その文字列内で使わなければ省略できる形が 望ましかったので以下の形にして無事動作しました。 /(?:("?|'|`)(.*?)\1):(?:("?|'|`)(.*?)\3):(?:("?|'|`)(.*?)\5)$/ \Gは始めて知りました。奥深くて理解が追いついてませんが、 勉強したいと思います。 初歩的で恥ずかしいのですが、クォーテーション部分の記述って 「"」または「'」または「`」または「入力なし」を表わすものとして "?|'|` で正しいのでしょうか それとも ["'`]? とか他に記述法があるのでしょうか。
624 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 01:29:40 ] 訂正 "?|'|`では正常に判定されませんでしたm(__)m。
625 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 13:29:56 ] "a1a2" =~ /([a-z][0-9])+/ p $1 p $2 これで$1に"a1" $2に"a2"になるようには出来ませんか? "a1a2" =~ /([a-z][0-9])([a-z][0-9])/ コレなら行くんですが・・・
626 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 13:36:41 ] ?
627 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 15:03:10 ] エスパー的にはscan使えでよさげ
628 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:56:11 ] 正規表現を学習したいのですが、自分の県には何処に行っても正規表現の本が辞典(リファレンス)以外売っていません 何か段階的に学習出来るお勧めの書物はないでしょうか?
629 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:57:28 ] とりあえずふくろう本
630 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:45:57 ] >>628 629さんも言ってる通り、正規表現の本はオライリーのフクロウしか選択肢が無いかも。 あとはネットで勉強すると良いかも。 パターンを何回自分で作ったかによるところが多いから、 PHPチェッカーで作りつつ勉強して、正規表現パズルで息抜きして。 って感じで、フクロウと併用するといいかも。
631 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:07:32 ] 体で覚えるのも一つの方法だな。 オレみたいに頭の弱いヤツなら。 正規表現検索機能つきのテキストエディタで試行錯誤してれば すぐに覚えられるよ。 unix の ed とか、まるで「正規表現養成ギブス」だもんな。
632 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:09:40 ] >>631 大丈夫、EDは治療できます。安心してください
633 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:22:11 ] パズルとかよりエロデータ整理とか ダウンロードの方が覚えると思うが。。。
634 名前:628 mailto:sage [2009/11/29(日) 21:36:03 ] 皆さん、ご返答ありがとうございました
635 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 15:26:13 ] 大量のエロデータとかダウンロードとかそんな興味ないわw
636 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 15:37:50 ] 実用的にはふくろうもいいけど、オートマトンや言語理論の勉強して 基礎を理解しておくと数学的に無理なことをやろうとしたりとか無駄に 悩まなくてよくなるのでお勧め。
637 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 16:21:11 ] 実装してみたけど、NFAからDFAへの変換で躓いた俺が通りますよ。
638 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 06:48:07 ] 「^\w+$」 から 「^_+$」 だけ除外して検索したいのですが、下のような記述でよいでしょうか? 自信がないのでお願いします。たぶん Perl です。 ^\w*[a-zA-Z0-9]\w*$
639 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 08:20:42 ] Perlだとしたら違うが、Perlじゃないとしても違う
640 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 09:19:26 ] >>638 そもそも\wは[a-zA-Z0-9_]じゃないんだが
641 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 11:35:49 ] >>638-639 ○ 1行内に、1文字以上の、空白を含まない英数単語のみ ^[0-9A-Za-z_]+$ であればマッチする、 ○ 但しアンダーラインのみ ^_+$ の連続は単語ではない。 正規表現はPerlの機能の一部として含まれる。すなわち、Perlには正規表現の機能が入っている。 正規表現で出来なくてもPerlなら出来る。
642 名前:デフォルトの名無しさん [2009/12/02(水) 12:35:03 ] perlです。 $str="aa(bb)cc"; $ptn="aa(bb)cc"; のとき、 $str=~/$ptn/; みたいな書き方でマッチさせたいんですが括弧が邪魔して無理でした。 $strと$ptnの内容は上記のままで、正規表現でマッチさせるにはどう書けば良いのでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 12:40:54 ] >>642 そういうのはperlのスレで聞けよ。 $quoted_ptn = quotometa($ptn); $str =~ /$quoted_ptn/ または $str =~ /\Q$ptn\E/
644 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 12:42:56 ] ごめんtypoしてるわ。 quotemetaが正解
645 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 12:51:49 ] >>643 いけました。 どうもすいませんでした。 そして、ありがとうございました。
646 名前:427 [2009/12/03(木) 21:59:36 ] 前方一致(前方参照)について教えてください。 ●正規表現の使用環境 秀丸7.11 HMJRE.DLL1.92 ●検索か置換か? 検索 ●説明 改行(空行)に挟まれたaだけを検索したい ●対象データ a a a ●希望する結果 a ←これだけマッチしてほしい a a
647 名前:デフォルトの名無しさん [2009/12/03(木) 22:00:06 ] 以下を試しましたがダメでした。 (?<=\n\n)a(?=\n\n) (?<=^$)a(?=\n\n) バラして試したところ、どうも後方一致で改行は認識してくれるみたいですが、前方一致では改行はダメのようです。 (?<=\n\n)a ←ダメ (?<=\n)a ←ダメ a(?=\n\n) ←OK そこで知りたいのは、 前方一致で改行を使えないのは仕様でそうなっているからでしょうか?そうした記載を見つけることが出来ませんでした。 また改行(空行)に挟まれた文字を検索する方法がありましたらぜひお教えください。
648 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 22:22:43 ] >>647 前方一致って look-behind のこと指して言ってんの? それはともかく、秀丸は改行絡みの扱いが弱いから制限事項でない?
649 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 22:33:51 ] >>646 マッチして欲しいaが空行に挟まれてないじゃん
650 名前:デフォルトの名無しさん [2009/12/03(木) 23:42:48 ] 秀丸v8β28なら (?#fulllinematch)\n(a)\n\n(?\1) でできるみたい 前方一致は秀丸で使われている独自用語。一般用語では648のとおり。
651 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 23:50:50 ] "(a b)(c d e)" こういう文字列を (a b)と(c d e)に分割する事って出来ませんか? 出来ればrubyでお願いします
652 名前:650 [2009/12/03(木) 23:52:40 ] おっと間違えた。 (?#fulllinematch)\n\n(a)\n\n(?\1) だ
653 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 00:46:20 ] r = /(\(+) ([^\(]+) (\)+) /x "(a b)(c d e)" .scan(r).map do |m| puts m.to_s end
654 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 00:51:04 ] ありがとうございます 追加で悪いんですが・・・ "(a b)(c (d e))" もし、こういうネスト構文になった場合 正規表現での分割は無理でしょうか? (a b) (c (d e))
655 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:39:38 ] >>654 全ての場合に対応するのは無理
656 名前:646 [2009/12/04(金) 07:03:25 ] >>650 ありがとうございました。 なんか最新βからfulllinematchなるものが使えるようになったみたいですね。 実にタイムリーでした。 おまけに (?<=\n\n)a を実行すると「前方一致では改行文字は使えません」なメッセージも表示するようになっていました。 で、「前方一致」って秀丸独自だったんですね。以後注意します。
657 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 20:12:15 ] >>653 を少し改良してみて p "(a b)(c d e)test".scan(/(\([^\(]*\))/) こうなったんですが 何故^\(を[]で囲わなきゃいけないんでしょうか? ↓のようにかいても意味は同じだと思うんですが動かないんです。かき方が違うんでしょうか? p "(a b)(c d e)test".scan(/(\(^\(*\))/) p "(a b)(c d e)test".scan(/(\(.*\))/)
658 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 20:24:08 ] 正規表現では、[]で囲まれると、他の部分と意味が変わって、 たとえば [^\(] の場合、( 以外の任意の一文字、という意味になる。
659 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 20:34:02 ] >>658 ^この否定は[]の中でしか使えないんですかね (a b)と(c d e)に分割するには/(\([^\(]*\))/これが最小コードとなるんでしょうか? あと>>653 さんのかいた//x のxの意味もよくわからず消してしまったんですが、xをつけると何が変わるんでしょう?
660 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 21:00:25 ] >>658 []の中の(はエスケープいらんだろう。 >>659 オマエはマニュアル読むって頭を持ってないのか?
661 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 21:20:50 ] >>660 だって、早く簡単にわかるならそのほうがいいじゃないですか。
662 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:11:59 ] うわぁぁぁ
663 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:52:52 ] >>660 //xについての記述はぐぐりにくいので見つけられなかったです
664 名前:デフォルトの名無しさん mailto:>>661 [2009/12/05(土) 00:03:30 ] | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | | | /  ̄ ̄ ̄ ̄ / / ぶち殺すぞ / / / / / / ____ / / / / /
665 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 00:05:30 ] 確かに調べるのめんどくさいんですが、 2chはいつから喰わず嫌いをはじめたのか、質問したい 次の方どうぞ
666 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 11:36:21 ] 釣りはいいから。獣の数字げっと
667 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 12:02:56 ] 鬼車でひいひいいわせてやるよ
668 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 15:49:19 ] 諸君、進んでおるかね?
669 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 18:46:12 ] ●正規表現の使用環境 otbedit(www.hi-ho.ne.jp/a_ogawa/otbedit/index.htm )というエディタです。 (emEditorでは行をまたいだ置換がうまくいかずotbeditに変えました。使えればソフトにはこだわりません) Perl互換の拡張正規表現が使えるとのことですが、詳しい説明が書いておらずわかりませんでした。 ●検索か置換か? 置換 ●説明 特定の文字列の間にある空でない文字列の最後に任意の文字列を加えること (例では@Bと@Aの間にある空でない文字列の最後にaを付け加えたい。できればそれから@Aと@Bは除外したい) 【@B(.|[\r\n])*?@A】で全体から特定の範囲を指定した後で 【[^\n]+$】→【$&a】の置換の繰り返しで可能ではありましたが、数が多いのでできれば一括で置換したいです。 ●対象データ @A あいうえお @B かき っくけこ さしす @A せそたち つてと @B なにぬね のは @A ひふへほ
670 名前:デフォルトの名無しさん [2009/12/15(火) 18:49:00 ] ●希望する結果 @A あいうえお @Ba かきa っくけこa さしすa @Aa せそたち つてと @Ba なにぬねa のはa @Aa ひふへほ ↑できれば@Aや@Bにaをつけたくはありません
671 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:39:29 ] ゼロ幅アサーション
672 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:54:38 ] 誰かCで正規表現できるクラス作れよ BOOST使いづらすぎる
673 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 02:34:55 ] CじゃなくてC++です
674 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 04:07:23 ] Boost Regex++じゃ駄目なのか
675 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 14:59:11 ] Boost使いづらいです・・・
676 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 15:27:52 ] xpressiveもだめ?
677 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 17:04:49 ] 今出先なので、帰ったら見てみます
678 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 18:28:13 ] 鬼車ってどうなんでしょうか?
679 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 19:27:41 ] どうって?
680 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 22:41:42 ] 性能?
681 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 23:06:52 ] 鬼車って確か検索機能しかないよね(置換機能が無い) 置換を自力で実装するの面倒なんで代わりにbregonig.dllとか使うんだけど 文字コードsjisしか使えなくて勿体無いあああってなる
682 名前:デフォルトの名無しさん [2009/12/25(金) 19:56:08 ] ●正規表現の使用環境 perl5.8.7 CentOS 5.3 文字コードはEUCです。 ●検索か置換か? 置換 ●説明 全銀テレ為替文字対応のため、数字、大文字英字、半角カナ・濁点、一部半角記号記号のみの文字列に 変換したいのです。 可能文字はこちら ttp://www.kyodocms.jp/qanda/qa18.htm これら以外の文字を半角スペースに置き換えたいのです。 ●対象データ 任意の文字列です。 1.ひらがな→カタカナ変換 2.全角→半角変換 3.英小文字→英大文字変換 4.ァィゥェォッャュョをアイウエオツヤユヨに変換 ここまで出来てて、入力可能文字以外をスペースに置き換えたいんですが、上手くいきません。 どうすればいいでしょうか?
683 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:29:25 ] [^0-9A-Zアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛°\\,\.「」\(\)\-\/] を に置換 あってるかどうかは試してないけどこういうこと?
684 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:49:43 ] >>683 レスどうもです。そのとおりです。 >>682 の条件を変数$regExpに代入し、 $result = 'パ-カ-ヲ買ツタ01234567'; $result =~ s/$regExp/ /g; とすると、漢字だった部分が文字化けし、「パ-カ-ヲ ・糟・1234567」となってしまいます。 結果は「パ-カ-ヲ ツタ1234567」にしたいのです。
685 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:05:51 ] 未定義領域含んでるんじゃね? 文字の正規表現 www.din.or.jp/~ohzaki/perl.htm#Character
686 名前:デフォルトの名無しさん [2009/12/26(土) 00:26:46 ] 質問があります。 <div id=・・・>←1 <div id=・・・> </div>←2 <div id=・・・> </div>←3 </div>←4 抜き出したいのは1から4全体なんですけど "<div id=・・・(.+?)</div> で非欲張り系で抜き出すと1から2までヒットします。 1から4全体を抜き出す方法ていうのはないのでしょうか? XML形式ならいけるぽいのですが・・・ 無理なのでしょうか?
687 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:52:00 ] 対応するタグという意味なら田中スペシャルが使えればできる。
688 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:16:39 ] ていうか素直にXMLパーサ使え
689 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 12:19:49 ] HTMLの処理には正規表現ではなくHTMLパーザを、XMLの処理にはXMLパーザを。 テンプレに入れてもいいレベルのFAQ。
690 名前:デフォルトの名無しさん [2009/12/27(日) 02:55:21 ] わかりました。パーサを調べてみます
691 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:29:47 ] 文字列を分割するとき、特定の文字で囲われているものは除外するっていう方法ありますか? phpなんですけど preg_splitで例えば A,B,C,'D,E',F を [0]=A [1]=B [2]=C [3]=D,E [4]=F 上記のように分割できますか?
692 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:34:35 ] 普通にCSVのモジュール使えばいいのでは
693 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:36:26 ] >>691 詳説 正規表現 にCSV処理のサンプルあるよ。オヌヌメ
694 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:29:52 ] ●正規表現の使用環境 Java1.5(Firefox 3.0.16) ●検索か置換か? 検索 ●説明 \.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jpという文字列を検索したいです。 ※検索対象の文字列自体が正規表現のようになっています。 ●対象データ \.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp ●希望する結果 \.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ※完全一致 自分なりに\を付けたりして試してみたのですが出来ませんでした。 以上、どうかよろしくお願いします。
695 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:02:17 ] 文字列定数内の \ 自体を \\ とするエスケープまで含めて "\\\\\\.nas\\(3\\|5\\)\\\\d\\+\\\\\\.\\[a\\-z\\\\\\-\\]\\+\\\\\\.nttpc\\.ne\\.jp" となる
696 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 10:01:19 ] >>695 694です。 どうもありがとうございました。 すごく長い表現になっちゃうんですね。(汗
697 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 15:49:42 ] こんにちは。 度々すみませんが、よろしくお願いします。 ●正規表現の使用環境 Java1.5(Firefox 3.0.16) ●検索か置換か? 検索 ●説明 #ipbf\d+souka.saitama.ocn.ne.jp という文字列を検索したいです。 //マッチする var body = document.body.innerHTML; var temp1; temp1 = new RegExp(/#ipbf\\d\+souka.saitama.ocn.ne.jp/); alert(temp1.test(body)); //マッチしない var body = document.body.innerHTML; var word = new Array(); var temp2; word.push('#ipbf\\d\+souka.saitama.ocn.ne.jp'); for (var i = 0; i < (word.length); i++) { temp2 = new RegExp(word[i]); alert(temp2.test(body)); } ●対象データ #ipbf\d+souka.saitama.ocn.ne.jp ●希望する結果(※完全一致) #ipbf\d+souka.saitama.ocn.ne.jp ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 「//マッチしない」方の配列内容を変えずに(\を追加せずに)一致させたいです。 以上どうか、よろしくお願いします。
698 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 16:25:29 ] Pattern.quote 使えばできるんでない?
699 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 22:01:43 ] >>697 word.push(/#ipbf\\d\+souka.saitama.ocn.ne.jp/);
700 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 22:38:39 ] >Java1.5(Firefox 3.0.16) JavaじゃなくてJavaScriptでしょ?それなら>>695 は正規表現リテラルでこう書ける /\\\.nas\(3\|5\)\\d\+\\\.\[a\-z\\\-\]\+\\\.nttpc\.ne\.jp/
701 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 16:48:00 ] >>698 >>699 >>700 返事が遅くなりすみません。 レスありがとうございます。 体調が悪くまだよく試していないのですが、まずはお礼だけで失礼します。
702 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 22:07:34 ] JavaとJavaScriptが区別できない人っていまだにいるのか…
703 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:16:48 ] VBとVBAの違いもな。 説明するの大変なんだよな・・・。
704 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:32:15 ] VBとVBAの違いなんて知らない奴たくさんいるだろ VB触ってるのは底辺だけなんだから
705 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:55:38 ] ゲーム機は全て「ファミコン」だ。
706 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 01:36:20 ] ファミコンって何だ? ピコピコのことか?
707 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:05:34 ] ピコピコはゲームウォッチ系じゃねーの? 知人が20万円ほど出してPC-98を買ったら 姉に「たっかいファミコンやなぁ」と言われたらしい。
708 名前:デフォルトの名無しさん [2010/01/05(火) 12:45:41 ] ●正規表現の使用環境 Java1.5 ●検索か置換か? 検索 ●説明 123456700 とか12345678-00など 7桁から10桁の数字にあと2桁の数字がハイフンもしくは連続して付属する数列の検索。 数列の直前にCodeまたはInvoiceがついてたら除外する。 Invoice 12345678-00 はマッチしないけどaccess# 12345678-00 はマッチする。 "On Invoice 123446789, your order was placed. However, please be sure to note that your account number 789456123 is suspended until further notice." 最初の番号Invoice 123446789は無視するけどaccount number 789456123はマッチするようにしたい。 ●対象データ Invoice 123446789 word 454545454 454545454545 Code: 4085432259 passcode 6789012 06 number 8901234 08 word 454545454 word ●希望する結果 マッチしない Invoice 123446789 Code: 4085432259 passcode 6789012 06 Code 7890123-07 ^(?!(Code|Invoice).)([^=\/%(.]\b\d{7,10}((\d?\d?)|(-\d\d))?\b) 自分でここまでやったけどうまく動かないです。 よろしくお願いいたします。
709 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 13:09:16 ] javaならプログラム書けるんだからInvoice,Codeのことはとりあえず 忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode, Invoiceがないことを確認する方がたぶん楽だと思うよ。
710 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 13:09:29 ] javaならプログラム書けるんだからInvoice,Codeのことはとりあえず 忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode, Invoiceがないことを確認する方がたぶん楽だと思うよ。
711 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 13:10:13 ] すまん2つ出た
712 名前:デフォルトの名無しさん [2010/01/05(火) 14:16:10 ] ありがとうございます。実際にはJAVAで作成しているわけではなく、アプリケーションがJAVAとおなじ正規表現を使用している環境なので、プログラムを書くことはできないんです。それでここでアドバイスがいただければと思いまして、
713 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 14:30:07 ] look-ahead(?!...)じゃなくてlook-behind(?<!...)を使うとこだね。 そしてlook-behindはたいていある決まった長さのの文字列に マッチするパターンがしか使えないので、 (?<!Invoice: )(?<!Invoice )(?<!Code: )(?<!Code ) のように並べて使うことになるだろう。 必要な仕様がきちんと書かれてないのでこれだというのは 示せないけどがんばれ。
714 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 14:51:49 ] ●正規表現の使用環境 VB.NET ●検索か置換か? 検索 ●説明 タブを含む何かの文字列の複数行を表す方法を教えて ●対象データ AAAA TAB TAB hogehoge改行 あああああ TABT ABT AB hogehoge改行 TAB TAB hogehoge改行 ZZZZ ●希望する結果 あああああ Regex("AAAA\n([\t.]+?\n)+(?<1>.+?\n)([\t.]+?\n)+ZZZZ",MultiLine) 上のように書いてみましたがだめでした。 AAAA改行とZZZZの間の文字列をターゲットにしつつ その中にタブか何かの文字の組み合わせの文字列が1つ以上あって、行末に改行がある という行がいくつかある。 ということを書いたつもりなのですが間違っているところを教えて頂きたいです。
715 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:06:04 ] [\t.]だとタブまたは任意の文字なので結局[\t.]+?は.+?と書いたのと同じ。 また、〜+?とは普通書かないね。〜*と同じなので。 \tが少なくとも一つ含まれた行にマッチさせたいなら、 .*\t.*\n
716 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:09:31 ] いや+?は最短マッチだろ。
717 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:12:27 ] Multilineなら\nは.に含まれないので、.+?\nと書いても結局.*\nと 同じになるっていいたいんじゃねーの?
718 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:48:20 ] それをいうなら.+じゃないか
719 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 16:31:59 ] 前にも .+? と .* が等価だと思ってる人がいたような。 \d? とかの ? と同じものに見えてるのかな。
720 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 22:00:58 ] >>715 [\t.] ってブラケットの中にはいってんのなら'.'は単なるピリオドでしょ。
721 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 22:09:28 ] Javascriptを勉強中です。といっても、ブックマークレット程度しかやってませんが。 正規表現を練っていたときに、もうかなり以前のブラウザから最短一致(ものぐさ/non-greedy/非貪欲)が 使えるようになっていたことを知り、いま必要というわけではないのですが、詳しく調べてました。 {n,m}? {n,}? *? +? ?? ←これらについては自習して使い方を理解したのですが、{n}? が解りません。 どう考えても {n} と {n}? は同じ結果になるように思えるのです。 正規表現のリファレンスや正規表現を解説しているサイトは数多く見ましたが、量指定子の直後に?を付けた {n}? を紹介はしていても、その使い方を例示したものを見つけることが出来ませんでした。 どなたか解説していただければ幸いです。よろしくお願いします。 記号関係はGoogleでも検索しづらいので、なかなか見つかりません。Googleの弱点ですね。
722 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 22:36:48 ] googleに頼り切ってるヤツの弱点に見えるけどなぁ ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html >a{n}? = ちょうどn回の繰り返しにマッチします。ちょうどn回なので、a{n}と等価であり、一貫性のためだけに存在します。 要するに/x{1}/の意味を問うているようなもん
723 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 12:53:43 ] >>722 的確な回答ありがとうございます。 >googleに頼り切ってるヤツの弱点に見えるけどなぁ 検索ばかりしてるんじゃなく良書を得てそれで勉強せよ、またはGoogleに頼り切ってると 目が節穴になるぞ、というお叱りと理解いたしました。 ☆perlretut - Perl の正規表現のチュートリアル ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html これは>>2 の一番最初、「正規表現メモ」のページにある一番最初のリンクですね。 答えへの近道はGoogleでなく、このスレにあったようで…目が節穴でした。 このチュートリアルはとても解説が丁寧で、まさしく良書だと思います。これで勉強します。 結論としては /x{n}/ と /x{n}?/ は同じ結果なので、通常 {n}? は使用されない、ですね。 やはりPerlだと細かい情報もしっかりあってスゴイです。 これからは正規表現で悩んだらこのスレとPerlの周辺を当たってみようと思います。
724 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 15:57:50 ] >>723 それ、Perlのマニュアルなんだよ。UNIX系のシステムだったら man perlretut を実行すると表示されるよ。 ウェブを見るより先にマニュアルを読めってことで。
725 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 16:31:29 ] .NET のマニュアルにも {n}? は {n} と等価って書いてあるな。 なんか訳が微妙におかしいけど。 msdn.microsoft.com/ja-jp/library/3206d374 (VS.80).aspx
726 名前:723 mailto:sage [2010/01/12(火) 22:05:22 ] >>724 UNIX系とは縁がありませんが、perlre/perlretutはWeb上にあるので、それをmanの代わりにします。 Javascriptで使える表現かどうかは、以下を見てチェック。 ☆RegExp - Core JavaScript 1.5 Reference - Mozilla Developer Center ttps://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp 出来るだけ大本の公式情報を参照すべし、ですね。 >>725 情報ありがとうございます。間違ってはいませんが、確かに変ですねぇ。 perlretut、面白いですね−。塩基配列のストップコドンのとことか。 自習してみて、チュートリアルと同じ結果になるのを確認したのはいいのですが… Javascript:var R=/(\w\w\w)*?TGA/g, S='ATCGTTGAATGCAAATGACATGAC', A = [], I = 0; while(R.test(S)) {A[I] = RegExp.lastMatch + ' (' + RegExp.lastParen + ') Pos=' + R.lastIndex; ++I;} alert(A.join('\n\n')); なぜずれるのか、理解できず…。その後バックトラックの動作を知り、単に「必ず3文字ずつ進む」と 思い込んでただけだと気付きました。。。マッチにトライして失敗したらそこで終わりではなく、 開始位置を1文字進めるんですね。筆者が仕掛けた罠に見事にハマりました。。。 というか、こういう処理は素直に3文字ずつ取り出して判定すべきですよね。 なお、Javascriptには\Gなんてありませんでした。残念!
727 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 21:03:05 ] >726 man じゃなくても perldoc perlretut でいけるよ。
728 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 16:56:04 ] >>725 MSDNライブラリは機械翻訳だからしかたないべ