正規表現 Part6at TECH
正規表現 Part6 - 暇つぶし2ch708:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/05 13:09:16
javaならプログラム書けるんだからInvoice,Codeのことはとりあえず
忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode,
Invoiceがないことを確認する方がたぶん楽だと思うよ。

710:デフォルトの名無しさん
10/01/05 13:09:29
javaならプログラム書けるんだからInvoice,Codeのことはとりあえず
忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode,
Invoiceがないことを確認する方がたぶん楽だと思うよ。

711:デフォルトの名無しさん
10/01/05 13:10:13
すまん2つ出た

712:デフォルトの名無しさん
10/01/05 14:16:10
ありがとうございます。実際にはJAVAで作成しているわけではなく、アプリケーションがJAVAとおなじ正規表現を使用している環境なので、プログラムを書くことはできないんです。それでここでアドバイスがいただければと思いまして、

713:デフォルトの名無しさん
10/01/05 14:30:07
look-ahead(?!...)じゃなくてlook-behind(?<!...)を使うとこだね。

そしてlook-behindはたいていある決まった長さのの文字列に
マッチするパターンがしか使えないので、

(?<!Invoice: )(?<!Invoice )(?<!Code: )(?<!Code )

のように並べて使うことになるだろう。

必要な仕様がきちんと書かれてないのでこれだというのは
示せないけどがんばれ。

714:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/05 15:06:04
[\t.]だとタブまたは任意の文字なので結局[\t.]+?は.+?と書いたのと同じ。
また、~+?とは普通書かないね。~*と同じなので。

\tが少なくとも一つ含まれた行にマッチさせたいなら、

.*\t.*\n

716:デフォルトの名無しさん
10/01/05 15:09:31
いや+?は最短マッチだろ。

717:デフォルトの名無しさん
10/01/05 15:12:27
Multilineなら\nは.に含まれないので、.+?\nと書いても結局.*\nと
同じになるっていいたいんじゃねーの?

718:デフォルトの名無しさん
10/01/05 15:48:20
それをいうなら.+じゃないか

719:デフォルトの名無しさん
10/01/05 16:31:59
前にも .+? と .* が等価だと思ってる人がいたような。
\d? とかの ? と同じものに見えてるのかな。

720:デフォルトの名無しさん
10/01/05 22:00:58
>>715
[\t.] ってブラケットの中にはいってんのなら'.'は単なるピリオドでしょ。


721:デフォルトの名無しさん
10/01/10 22:09:28
Javascriptを勉強中です。といっても、ブックマークレット程度しかやってませんが。
正規表現を練っていたときに、もうかなり以前のブラウザから最短一致(ものぐさ/non-greedy/非貪欲)が
使えるようになっていたことを知り、いま必要というわけではないのですが、詳しく調べてました。

{n,m}? {n,}? *? +? ?? ←これらについては自習して使い方を理解したのですが、{n}? が解りません。
どう考えても {n} と {n}? は同じ結果になるように思えるのです。
正規表現のリファレンスや正規表現を解説しているサイトは数多く見ましたが、量指定子の直後に?を付けた
{n}? を紹介はしていても、その使い方を例示したものを見つけることが出来ませんでした。
どなたか解説していただければ幸いです。よろしくお願いします。

  記号関係はGoogleでも検索しづらいので、なかなか見つかりません。Googleの弱点ですね。

722:デフォルトの名無しさん
10/01/10 22:36:48
googleに頼り切ってるヤツの弱点に見えるけどなぁ

URLリンク(www.kt.rim.or.jp)
>a{n}? = ちょうどn回の繰り返しにマッチします。ちょうどn回なので、a{n}と等価であり、一貫性のためだけに存在します。

要するに/x{1}/の意味を問うているようなもん

723:デフォルトの名無しさん
10/01/11 12:53:43
>>722
的確な回答ありがとうございます。

>googleに頼り切ってるヤツの弱点に見えるけどなぁ
検索ばかりしてるんじゃなく良書を得てそれで勉強せよ、またはGoogleに頼り切ってると
目が節穴になるぞ、というお叱りと理解いたしました。

☆perlretut - Perl の正規表現のチュートリアル
URLリンク(www.kt.rim.or.jp)
これは>>2の一番最初、「正規表現メモ」のページにある一番最初のリンクですね。
答えへの近道はGoogleでなく、このスレにあったようで…目が節穴でした。
このチュートリアルはとても解説が丁寧で、まさしく良書だと思います。これで勉強します。

結論としては /x{n}/ と /x{n}?/ は同じ結果なので、通常 {n}? は使用されない、ですね。

やはりPerlだと細かい情報もしっかりあってスゴイです。
これからは正規表現で悩んだらこのスレとPerlの周辺を当たってみようと思います。

724:デフォルトの名無しさん
10/01/11 15:57:50
>>723
それ、Perlのマニュアルなんだよ。UNIX系のシステムだったら
man perlretut を実行すると表示されるよ。

ウェブを見るより先にマニュアルを読めってことで。



725:デフォルトの名無しさん
10/01/11 16:31:29
.NET のマニュアルにも {n}? は {n} と等価って書いてあるな。
なんか訳が微妙におかしいけど。

URLリンク(msdn.microsoft.com)(VS.80).aspx

726:723
10/01/12 22:05:22
>>724
UNIX系とは縁がありませんが、perlre/perlretutはWeb上にあるので、それをmanの代わりにします。
Javascriptで使える表現かどうかは、以下を見てチェック。
☆RegExp - Core JavaScript 1.5 Reference - Mozilla Developer Center
URLリンク(developer.mozilla.org)
出来るだけ大本の公式情報を参照すべし、ですね。

>>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:デフォルトの名無しさん
10/01/13 21:03:05
>726
man じゃなくても perldoc perlretut でいけるよ。

728:デフォルトの名無しさん
10/01/15 16:56:04
>>725
MSDNライブラリは機械翻訳だからしかたないべ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch