[[20240527121912]] 『正規表現の書き方』(みつ) ページの最後に飛ぶ

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

 

『正規表現の書き方』(みつ)

150 x 150 x 200mm 10枚/束

という寸法等の記載された文字列があります。

ここから「10」だけを取り出したい時に正規表現のパターンはどのように書けば良いのでしょうか?10や枚の数は変化します。

10枚の前には半角のスペースが2つある状態です。

\s\s\d+\w+/
\s{2}\d+\w+/
とかは全然だめでした。

どうすれば良いのでしょう?
お願いします。

< 使用 Excel:Excel2021、使用 OS:Windows11 >


データの例が1つなので、不安がありますが
つぎの式でどうでしょう。

=SUBSTITUTE(MID(A1,FIND("m",A1)+2,100),"枚/束","")*1
(メジロ) 2024/05/27(月) 12:56:03


 VBAなら、
 "\d+ x \d+ x \d+mm (\d+)枚/束"
 で、試してください。
(tkit) 2024/05/27(月) 13:01:34

 > 10枚の前には半角のスペースが2つある状態です。 

 正規表現にこだわらなければ、下記のコードでも。

 s = "150 x 150 x 200mm  10枚/束"
 MsgBox Val(Split(s,"  ")(1))
(hatena) 2024/05/27(月) 13:47:09

 >半角のスペースが2つある状態です。 
 それは条件ではなく、実状の説明ですよね?

 現実的にはこれでいいような気がしますけども
        ↓
      \d+(?=\D+/)

(半平太) 2024/05/27(月) 14:10:20


 仕様は明確でないのでどのようにも解釈できますよね。

 半角スペース2つの直後の数値

 数字以外の一文字の後に/がある直前の数値

 あるいは上記の2つの条件を満たす

 \s\s\d+\w+/
 \s{2}\d+\w+/

 というよなパターンから推測すると2つの条件を満たすという仕様という気もします。

 (?<=\s\s)\d+(?=\D+/)

(hatena) 2024/05/27(月) 16:49:08


 直前にスペースが2個限定で存在する事を条件にしなければならない合理的な理由が
 私には思い至らないなぁ・・

 あと、このパターンて、VBAで使えますか? 私は成功しなかったのですが。
      ↓
 (?<=\s\s)\d+(?=\D+/)

(半平太) 2024/05/27(月) 17:03:03


 (1)
 > 10や枚の数は変化します。
 10が枚数ですよね。
 "10「や」枚の数"
 ということは、枚と言う文字列が複数あるんですか?
 そうであれば、そうした例の文字列全体を示されたほうがよいと思いました。

 (2)
 > \s\s\d+\w+/
 > \s{2}\d+\w+/
 惜しかったですね。
 \w ではなく\W  ですね。
 (  \w は  '[A-Za-z0-9_]' と同じ意味です。  (アルファベットと数字とアンダースコア)
    \W は、'[^A-Za-z0-9_]' と同じ意味です。(上記の\w以外の任意文字))
 また、数字部分だけを記憶するために(\d+)とカッコで囲む必要があります。
 そのうえで、matches(0).submatches(0)でその数値部分だけを取り出します。

 なお、数字の前の空白2つで特定できるので、単に"  (\d+)"で良かったでしょうし、
 "  \d+"として、得られたマッチ文字列をTrimしてもよかったかもしれません。

 (3)
 それか半平太さんのように、(?=Pattern)という "肯定先読み"を使って、
 \d+(?=枚)
 とするとカッコで記憶しなくてもよいかとおもいます。
 なお、\Dは数字以外なので、空白にも"m"にもマッチするかと思います。
 (?<=Pattern)という"肯定後読み"は、VBScriptの正規表現には実装されていません。

(xyz) 2024/05/27(月) 17:15:37


 半平太さん
 >  直前にスペースが2個限定で存在する事を条件にしなければならない合理的な理由が
 > 私には思い至らないなぁ・

 まあ、そういわれれば同感ですが。

 xyzさん、勉強になります。

 話は変わりますが、
 VBScriptは2027年頃に無効になるらしいですが、
 そうなるとCreateObject("VBScript.RegExp")も使えなくなるのでしょうか。
(hatena) 2024/05/27(月) 17:48:25

皆様
仕事が終わって覗いてみたらとても沢山のコメントを頂きまして非常に驚いてます。
関数のものや正規表現の書き方、明日会社でそれぞれ試してみます。
VBAは独学で、コツコツやるものの難しいものですね。

今回の質問は商品詳細から入り数を抜いて1個あたりの値段と掛け算する為のもので、
入り数の桁も変われば単位に当たる枚が小箱やケースなどに変わるので沢山の商品を一発で終わらせたく書かせていただきました。

途中midを使ったりとかどうかなとか考えています。

とにかくありがとうございました。
(みつ) 2024/05/27(月) 19:15:21


皆様 昨日はありがとうございました。
肯定先読みとかの知識は全くなく、改めて調べてみてこんな感じに行きつきました。

"(\d+)(\D+(?=/))"
これをmatchesCollection(0).submatches(0)で取得出来るようになりました。

VBAの書籍は何冊か所持しているものの正規表現については書かれていなかったので、VBAではあまり使わないのですかね?今回の件でとても便利に感じました。

学生時代はパソコンに縁がなかった世代なので初心者みたいな質問も多いと思いますが、
今後とも宜しくお願い致します。
(みつ) 2024/05/28(火) 16:12:23


 解決されたようで何よりです。(私も学生時代は、パンチカードを持ちこんで大型計算機を利用するような時代でしたww。)

 hatenaさん、VBScript の廃止についての情報ありがとうございました。

 マイクロソフト社の発表(「VBScript の廃止: タイムラインと次のステップ」)は以下のようです。
https://techcommunity.microsoft.com/t5/windows-it-pro-blog/vbscript-deprecation-timelines-and-next-steps/ba-p/4148301
 (Browserの「日本語に翻訳」機能を使って読んで下さい。←余計なお世話かもしれませんが)

 | VBA で VBScript をタイプライブラリ参照 (VBScript 正規表現など) として使用する部分については、
 | フェーズ 1((注)廃止の第一段階のこと) の影響を受けないため、
 | 既存のソリューションを引き続き使用できます。
 | ただし、将来のフェーズは影響を受けるため、新しい展開に注意してください。
 ということのようです。(注)を除き、引用です。

 私見ですが、VBScript 正規表現の有用性や、VBAにおける他の代替手段がないだろうことは認識しているようなので、
 致命的なことにはならないだろうと見ています。
(xyz) 2024/05/29(水) 06:40:16

 脱線しますが

 【全世界待望】ついにExcelで正規表現が使えるようになるぞ!! XLOOKUPでも正規表現で検索できるようになるらしい (なおVLOOKUPは...)
https://www.youtube.com/watch?v=eyWzJSnK6go
(マナ) 2024/05/29(水) 07:40:54

 貴重な情報有難うございました。
 Google Spreadsheetには既に同種の3機能の関数がありますから、対抗上の観点もあるんでしょうか。
 そちらの方は 社員である Russ Coxさんの開発したRE2という正規表現エンジンが使われています。
 Excelの正規表現が、どんなエンジンを使ったものになるのか興味がありますね。
 公表記事では触れられていないようです。個人的にはPCREなんかを希望します。

(xyz) 2024/05/29(水) 09:14:54


コメント返信:

[ 一覧(最新更新順) ]


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