[[20161204073212]] 『正規表現にて』(nobuhiko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『正規表現にて』(nobuhiko)

 いつも 拝見させて頂いております

 宜しくお願いします

 "Song.Top...EX.07. Taylor Swift - Shake It Off (feat. Skylar & Jordyn).txt"
 "Song.Top...07. Taylor Swift - Shake It Off (feat. Skylar & Jordyn).txt"

 2つのファイル名があります
 結果を

 Taylor Swift - Shake It Off (feat. Skylar & Jordyn)

 ↑2つ共このようにしたいのですが正規表現では
 パターンをどのように書けばよろしいのでしょうか?

 "." + 半角スペース でmid関数で取り出し.txtを置換すればいいのですが
 正規表現を勉強中の為 正規表現で教えて頂ければ幸いです

 "^Song\.Top\.\.\..*\.\s" のような愚直なパターンを何度か試みますが
 結果は"Skylar & Jordyn).txt"や"txt"のようになってしまいます

 どうかご教示ください
 宜しくお願い致します

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 すみません
 今しがたこれで置換をしてくれました

 With CreateObject("VBScript.RegExp")
     .Pattern = "(^Song\.Top\.\.\..*?\.\s|\.txt)"
     .IgnoreCase = True
     .Global = True
     b = .Replace(a, "")
 End With

 多分あっていると思うのですが
 この構文で良いのか悪いのかさえもわかりません
 もし宜しければ 添削をお願いさせて頂けないでしょうか

 どうか宜しくお願い致します

 PS:決まり事を書き忘れていました
 最初は Song.Top...EX.○○."  + 半角スペース(○は数値なのですが文字数が決まっていません)
 または Song.Top...○○○○." + 半角スペース(○は数値なのですが文字数が決まっていません)
 で始まり
 最後は必ず".txt"の4文字で終わります

 どうか宜しくお願い致します

(nobuhiko) 2016/12/04(日) 08:23


 追加説明の前に、

 >> "." + 半角スペース でmid関数で取り出し.txtを置換すればいいのですが

 この説明から、勝手に、

 最初に .半角スペース が現れるまでの部分と、末尾の拡張子(.txt に限らず)を削除する。 

 こういうことにして書いたものです。実際の要件とは異なるかもしれませんが

 Sub Test()
    Dim s As String
    Dim re As Object

    Set re = CreateObject("VBScript.RegExp")
    re.ignorecase = True
    re.Global = True
    re.Pattern = "^.+?\.\s|\.[^\.]+?$"

    s = "Song.Top.hoge.hogehoge.EX.07. Taylor Swift - Shake It Off (feat. Skylar & Jordyn).txt"
    s = re.Replace(s, "")
    MsgBox s

 End Sub

(β) 2016/12/04(日) 09:21


 ↑と同じ解釈ですけど、不要な部分の削除ではなく必要部分の取り出しをやってみました。
 (VBScript の正規表現では、肯定後読み がサポートされていないので、この部分だけは MID関数で消してますけど)

 条件にあう文字列がなかった場合のエラー処理は割愛しています。

 Sub Test2()
    Dim s As String
    Dim re As Object

    Set re = CreateObject("VBScript.RegExp")
    re.ignorecase = True
    re.Pattern = "\.\s.+(?=\.[^\.]+?$)"

    s = "Song.Top.hoge.hogehoge.EX.07. Taylor Swift - Shake It Off (feat. Skylar & Jordyn).txt"
    s = Mid(re.Execute(s)(0), 3)
    MsgBox s

 End Sub

(β) 2016/12/04(日) 10:32


 βさん 早々のご回答ありがとうございました
 難しいです
 2通りもありがとうございました

 朝から随分と勉強させて頂いたのですが
 どうにもわからない箇所がありますので
 どうかご教示をお願いします

 [^\.] こちらなのですが [^.] とは違うものなのでしょうか?

 Test2の +(?= この部分が 最後尾から\.[^\.]+?の前までと云う意味だと
 感覚的に捉えてはいるのですが
 +(?= ちょっと理解できないでいます

 また+(?= このクエスチョンマークは
 test1のピリオド+空白までの
 最短の繰り返しで使用されていますクエスチョンマークとは
 違う意味を持っているものなのでしょうか?

 どうかお教えをお願いできないでしょうか?
 宜しくお願い致します

(nobuhiko) 2016/12/04(日) 14:26


 すみません

 ご質問にお答えしていませんでした
 すみません

 >この説明から、勝手に、
 >最初に .半角スペース が現れるまでの部分と、末尾の拡張子(.txt に限らず)を削除する

 はい この通りです
 言葉足らずですみません

 >こういうことにして書いたものです。実際の要件とは異なるかもしれませんが

 全く異なりません
 ご配慮のコメントありがとうございます

(nobuhiko) 2016/12/04(日) 14:31


 >> [^\.] こちらなのですが [^.] とは違うものなのでしょうか?

 エクセルには多くの比較機能がありますね。たとえば Like演算子。
 ここでは # や * や ? は、特別な意味を持つ制御文字として扱われますね。
 ですから、文字としての、これらのものを相手にする場合は、制御文字ではなく文字としての # ですよ ということで[#] と記述しますね。
 こういったことをエスケープ処理と呼んだりしますが、それぞれの機能ごとに、これらの指定方法という【お約束】が異なります。

 VBScriptの正規表現では ^  $  ?  *  +  .  |  {  }  \  [  ]  (  )
 この14種類が、制御文字(メタ文字とも呼ばれます)で、これらを、そのものずばりの文字として扱いたい場合に
 \. といったように \を付けます。これはお約束です。

 ですから \. は、半角のピリオドそのもの という意味になります。
 . だけだと、すべての1桁の文字 とみなされます。

 (ご自身のコード内で、すでに使っておられますよ?)

 >>Test2の +(?= 

 たとえば "パターン文字列A" というものを与えると、当然、"パターン文字列A" に合致するものが対象になりますね。
 "パターン文字列B" を与えると、"パターン文字列B" に合致するものが対象になりますね。

 ここで、"パターン文字列Aパターン文字列B" と指定すると パターンA であり、かつ パターンB であるものが
 対象になりますね。

 もう1つ。
 正規表現は、文中から指定されたパターンに合致するものをピックアップして我々に渡してくれますが、
 Global=Trueの場合は、次の解析を、我々に渡してくれた文字列の【次の文字】から始めます。
 (我々に渡した文字列までを消化するとか消費するといったりします)

 一方、"パターン文字列A(?=パターン文字列B)
 この場合、正規表現は、あくまでパターンAで検索して、該当のものがあれ我々に渡してくれるのですが
 その際に、【付帯条件】として、パターンAに合致する文字列の後ろにパターンBが続いているものという条件を加味してくれます。

 "指定パターン(?=後続パターン)"  この後半の ( ) 内、肯定先読みといったりしますが、付帯条件であり
 その部分は、もちろん、正規表現エンジンはチェックしているのですが「消費」はしていません。
 次の解析は、あくまで 指定パターン で抽出された文字列の次の文字からになります。

 "指定パターン(?!後続パターン)"   という指定もあって、これは付帯条件として、後続パターンではないものという意味になります。
 これを否定先読み といったりします。

 正規表現の考え方としては 先行パターンと 指定パターンを組み合わせた、肯定後読みや否定後読み もあるのですが
 VBScript では、それがサポートされていないので、私のコードでは、やむなく、その部分も指定パターンに含めて、
 抽出後、頭2桁をカットしています。

 ●正規表現に関しては、私もよちよち歩き。
 学校の回答陣には、エキスパートさんが綺羅星のごとく存在しておられます。
 γさんであるとか、最近はお見えにならないのですが seiyaさんであるとか。
 こうしたエキスパートさんの回答パターンを拝見すると、βなんぞは、ただただ、うなるだけです。

 学校の全文検索で VBScript seiya や VBScript γ といれて検索すると
 【匠の技】が堪能できます。ぜひ、閲覧してみてください。

(β) 2016/12/04(日) 16:24


 まだ 読んでおりませぬが
 既読のサインを と思いコメントさせて頂きます
 本当に貴重なお時間ありがとうございました
 今から 本日の復習といたしまして
 ゆっくりと読ませて頂きます
 既読後には またコメントさせて頂きます

 お時間ありがとうございました

( nobuhiko) 2016/12/04(日) 16:43


 βさんから過分な取扱をいただき恐縮ですが、私もまだまだ発展途上です。お手柔らかに。

 ところで、ご質問の最初の件ですが、
 manualによると以下のようになっています。

 > ■角かっこ表現
 > 一致させる文字のリストを作成するには、1 つまたは複数の文字を角かっこ ([ ]) 内に
 > 指定します。このように表現したリストを、"角かっこ表現" と呼びます。
 > 角かっこ内の通常文字は、ほかの場所で使用する場合と同様、その文字自身を表します。
 > つまり、入力テキストにおけるその文字自体に一致します。角かっこ内で特殊文字を
 > 指定すると、ほとんどの場合、特殊文字としての意味は無効になります。ただし、
 > 次のように、例外となる文字もあります。 
 > 
 > ・  ']' 文字は、リストの先頭の項目でない限り、リストの終了を示します。
 >  リスト内で ']' 文字に一致させるには、リストの先頭 (左角かっこ '[' の直後) に
 >  指定します。 
 > ・ '\' 文字は通常どおり、エスケープ文字として機能します。
 >  '\' 文字に一致させるには、'\\' を使用します。 

 従って、
 '.'以外という意味で、[^.] と書いても、[^\.]と書いても効果は同じと思いますが、
 いかがでしょうか。

 ------------
 余談になりますが、
 改行を含む任意文字をマッチさせる場合の方法として、 
  1 日本語のマニュアル(Script56.chmなど)の「正規表現の構文」の'.'の項には、 
         .Pattern = "[.\n]" 
      としますと記されていますが、これは間違いです。 
     ([]のなかで'.'は単なる'.'という通常文字と認識されるので。) 
 2 "[\s\S]" 方式を推奨します。 
 3 "(.|\s)" でも良いと思います。

(γ) 2016/12/04(日) 19:51


 To γさん

 >>角かっこ内の通常文字は、ほかの場所で使用する場合と同様、その文字自身を表します。
 >> つまり、入力テキストにおけるその文字自体に一致します。

 いつもご指導ありがとうございます。
 そうでしたか。これは知りませんでした。
 知らないことが多すぎます。

(β) 2016/12/04(日) 20:01


 To nobuhikoさん

 γさんがふれられた【Script56.chm】ですが、正規表現も含んだ各種ヘルプです。

[[20150923102824]]

 この (γ) 2015/09/23(水) 23:41 で、このファイルの取り込み方法を説明していただいてます。
 ローカルヘルプとして便利ですので、nobuhikoさんも是非。

 (といいながら、必要なところしか読まないので、[\.]は[.]でよかった ということに今の今まで気が付かなかったβですが・・汗)

(β) 2016/12/04(日) 20:46


http://www.mnet.ne.jp/~nakama/

 参考まで。
(seiya) 2016/12/04(日) 23:22

 おはようございます
 すべて読ませて頂きました
 βさん色々なアドバイスありがとうございました
 ずっと大切に保存しておきたいと思います
 ありがとうございます

 γさん seiyaさん コメントありがとうございました
 大変勉強になりました
 ありがとうございました

 改行コードがあれば の一連のスレッド群
 これから何回も読むことになるなぁ
 などと思いながら読ませて頂きました
 スレッドの紹介ありがとうございました

 みなさん 昨日はありがとうございました

 PS:Script56.chmページがなくなってしまったのでしょうか
   昨晩探したのですが 残念です(オンラインでがんばります)
    それでは失礼いたします

( nobuhiko) 2016/12/05(月) 08:20


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.