Excelで、アドインやVBAをまったく使わずに数式のみで、正規表現検索を行うことは可能でしょうか?


とまでは行かなくとも出来るだけ汎用性のある処理方法を知りたいのですが、例えば

 http://www.google.co.jp/search?num=100&hl=ja&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&lr=

上記 URL のような文字列から

 num=100



 q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE

などを取り出したい場合、どんな方法があるのでしょうか。

回答の条件
  • URL必須
  • 1人50回まで
  • 登録:2006/05/16 17:43:30
  • 終了:2006/05/17 14:49:14

ベストアンサー

id:villain No.4

villain回答回数174ベストアンサー獲得回数122006/05/16 18:26:24

ポイント50pt

こんな感じはどうでしょうか。


=MID(対象セル,SEARCH(区切り文字,A1,1),SEARCH("&",RIGHT(対象セル,LEN(対象セル)-SEARCH(区切り文字,対象セル,1)+1),1)-1)
例
・num=100
 =MID(A1,SEARCH("num=",A1,1),SEARCH("&",RIGHT(A1,LEN(A1)-SEARCH("num=",A1,1)+1),1)-1)
・q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
 =MID(A1,SEARCH("q=",A1,1),SEARCH("&",RIGHT(A1,LEN(A1)-SEARCH("q=",A1,1)+1),1)-1)


ただし、必ずクエリが複数ないと("&"で区切っているため)エラーに

なります。

完全なものは関数では無理だと思います。

http://www.google.co.jp/search?num=100&hl=ja&q=%E6%AD%A3%E8%A6%8...

id:kamiochiai

ありがとうございます。

なるほど、対象クエリが末尾に来る場合の処理を別箇でIF文で誤魔化せば

ある程度まで汎用性を上げられそうです。

これ見て思いついたのが

"&num=100" または "?num=100" を検索するつもりで処理して、

最後に"&"をはずす、というのでも汎用性が上がりそうです。

素晴らしいです!ありがとうございます。

【追記】

この場合 A1&"&" という文字列にしてしまえば&がなくてもエラー出なくなりました。

この技いろんな場面で応用できそうです。

2006/05/16 19:25:05

その他の回答(4件)

id:lego05 No.1

lego05回答回数104ベストアンサー獲得回数32006/05/16 17:54:37

id:kamiochiai

ありがとうございます。

前者は非常に近い内容と思われますが、今探しているものは単に方法だけです。

後者のソフトウェアに依存する方法は、質問のとおり対象外です。

2006/05/16 18:06:55
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/05/16 17:56:45

ポイント20pt

SEARCH 関数、FIND 関数 を使用してみてはいかがでしょうか?

ワイルドカードの使用可否や、大文字小文字の区別可否等、一長一短があるようですが、

適宜上手く組み合わせて使用すれば良いかと思います。

http://www.yahoo.co.jp ダミー

以下、オンラインヘルプより抜粋

--------------------------------------------------------------------------------------

SEARCH 関数

SEARCH 関数は、開始位置を先頭にして、指定された文字列 (検索文字列) をほかの文字列 (対象) の中で検索し、その文字列が最初に現れる位置の文字番号を返します。SEARCH 関数を使用すると、ある文字列に含まれる特定の文字列の位置を調べることができ、さらに MID 関数や REPLACE 関数と組み合わせて、その文字列を置き換えることができます。

書式

SEARCH(検索文字列,対象,開始位置)

SEARCHB(検索文字列,対象,開始位置)

SEARCH 関数および SEARCHB 関数では、文字列を検索するとき、英字の大文字と小文字は区別されません。



FIND 関数

FIND 関数では、指定された文字列 (検索文字列) を他の文字列 (対象) の中で検索し、その文字列が他の文字列内で最初に現れる位置を左端から数え、その番号を返します。SEARCH 関数と同じような働きをしますが、FIND 関数では英字の大文字と小文字を区別できる代わりに、ワイルドカード文字を使用することができません。

書式

FIND(検索文字列,対象,開始位置)

FINDB(検索文字列,対象,開始位置)

id:kamiochiai

ありがとうございます。

なるほど、この場合 SEARCH("num=",A1,0) と SEARCH("&",A1,SEARCH("num=",A1,0))と MID, LEN の組み合わせで

なんとか作れそうです。

例外処理が大変そうです。

2006/05/16 18:15:27
id:kisaramatsui No.3

きさら回答回数19ベストアンサー獲得回数22006/05/16 18:03:34

ポイント20pt

http://ponytail.jpn.org/lightnovel/

URLはダミーです。

対象となる文字列の構造が分かっているのであれば、

切り出したい文字列の開始位置と終了位置を

findかsearchで探して、midで切り出せます。

かなり面倒だと思います。

id:kamiochiai

ありがとうございます。

URLだと構造が可変になりがちで、確かに面倒そうですね。

今試しに使ってみたら、MIDって開始位置と文字数の指定なんですね。(終了位置を指定するのかと思っていた)

でもこれはLENの組み合わせで出来そうです。

2006/05/16 18:20:03
id:villain No.4

villain回答回数174ベストアンサー獲得回数122006/05/16 18:26:24ここでベストアンサー

ポイント50pt

こんな感じはどうでしょうか。


=MID(対象セル,SEARCH(区切り文字,A1,1),SEARCH("&",RIGHT(対象セル,LEN(対象セル)-SEARCH(区切り文字,対象セル,1)+1),1)-1)
例
・num=100
 =MID(A1,SEARCH("num=",A1,1),SEARCH("&",RIGHT(A1,LEN(A1)-SEARCH("num=",A1,1)+1),1)-1)
・q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
 =MID(A1,SEARCH("q=",A1,1),SEARCH("&",RIGHT(A1,LEN(A1)-SEARCH("q=",A1,1)+1),1)-1)


ただし、必ずクエリが複数ないと("&"で区切っているため)エラーに

なります。

完全なものは関数では無理だと思います。

http://www.google.co.jp/search?num=100&hl=ja&q=%E6%AD%A3%E8%A6%8...

id:kamiochiai

ありがとうございます。

なるほど、対象クエリが末尾に来る場合の処理を別箇でIF文で誤魔化せば

ある程度まで汎用性を上げられそうです。

これ見て思いついたのが

"&num=100" または "?num=100" を検索するつもりで処理して、

最後に"&"をはずす、というのでも汎用性が上がりそうです。

素晴らしいです!ありがとうございます。

【追記】

この場合 A1&"&" という文字列にしてしまえば&がなくてもエラー出なくなりました。

この技いろんな場面で応用できそうです。

2006/05/16 19:25:05
id:villain No.5

villain回答回数174ベストアンサー獲得回数122006/05/16 21:06:38

ポイント20pt

まだいくつか問題点がありました。


例えば

  • "a="を検索すると"aa="とか"ba="などもヒットしてしまいます
    • これは忘れていましたが実際にはkamiochiaiさんも気がついた
      通りに"&a="などのようにすればある程度、回避可能です
  • "&a="を検索したときに"&a="が複数あった場合
    • 本来クエリとしては間違っていますがこの場合に正常に検索
      できないのは仕様なので諦めてください


他にもあるかも?


つまらない補足ですが、すみません。


http://www.google.co.jp/search?num=100&hl=ja&q=%E6%AD%A3%E8%A6%8...

id:kamiochiai

いえいえ、ありがとうございます!

今のところまとめると、こうなりました。

=IF(ISNUMBER(SEARCH(検索クエリ,A1&"&",1)),MID(A1&"&",SEARCH(検索クエリ,A1&"&",1),SEARCH("&",RIGHT(A1&"&",LEN(A1&"&")-SEARCH(検索クエリ,A1&"&",1)+1),1)-1),"")

充分使えそうな式になりました!

皆さんありがとうございました。

2006/05/17 14:48:05

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません