正規表現についての質問です。キーワード検索のときに、空白があるとそれでキーワードを分けているのですが、""で囲まれたのがあると、それはフレーズとしてキーワードに登録したいのです。どうするといいでしょうか? Macintosh "iPod Touch 8G" iPhone のよう場合に、キーワード用の連想配列としては、array('Macintosh','iPod Touch 8G','iPhone') のようにしまいこみたいのです。単純に空白で切り分けると 'Macintosh' '"iPod' になってしまいます。

いろいろ方法はあるかと思います。正規表現で、iPod Touch 8G の空白を置き換えル方法もあるでしょう。この種の処理はよく行われるはずなんで、何かよい方法があったら教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/04/29 16:11:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:koriki-kozou No.1

回答回数480ベストアンサー獲得回数79

ポイント60pt

正規表現では無理というか不可能


今回も開発言語についての記載がなく困ってしまう

仮にphpであればstr-getcsvでデリミタとして空白を指定するなどで対応

PHP: str_getcsv - Manual

http://jp.php.net/manual/en/function.str-getcsv.php

id:kaiketsu

いろんな言語で使いたいと思ったのですが、無理なんでしょうか? 上記のだと PHP 5.3 以上ですね。

2010/04/29 16:09:15
  • id:hu2
    koriki-kozouさんと同じく私も正規表現では無理かと思います。

    以下はHaskellのコードです。
    実現しようとされている処理では、
    対象の空白文字が、ダブルクォートされている箇所にあるのか(in)、されていない箇所なのか(out)逐一判別する必要があるかと思いますが、
    そのような判別を正規表現では表現出来ないと思います。

    >|
    main = do cs <- getContents
    putStr $ unlines $ map chkDlmOut $ lines cs

    chkDlmOut :: String -> String
    chkDlmOut [] = []
    chkDlmOut ('"':cs) = '"' : chkDlmIn cs
    chkDlmOut (' ':cs) = '|' : chkDlmOut cs
    chkDlmOut (c:cs) = c : chkDlmOut cs

    chkDlmIn :: String -> String
    chkDlmIn [] = []
    chkDlmIn ('"':cs) = '"' : chkDlmOut cs
    chkDlmIn (c:cs) = c : chkDlmIn cs
    |<
  • id:lunlumo
     これ位なら正規表現でも書けますよ。

    >|ruby|
    query = ARGV.first || 'Macintosh "iPod Touch 8G" iPhone'
    puts "query: #{query}"
    keywords = \
    query.scan(/\G(?:\s+)?(?:(?:\"((?:[^\"]|(?:\"\"))*)\"(?=\s|\Z))|(\S+))/).inject([]) do |r, m|
    r << (m.first && m.first.gsub(/\"\"/,'"') || m.last)
    r
    end
    puts keywords.join("\n")

    ||<
  • id:koriki-kozou
    koriki-kozou 2010/05/01 03:04:57
    id:lunlumo さん

    確かに'Macintosh "iPod Touch 8G" iPhone "show leopald" OSX'などでも正しく分けている
    一見すると正しく見えなくも無い

    問題は「正規表現だけで実現できている訳ではない」という点
    ループさせて順に抜き出すようなことならば他の言語でも容易なこと
    容易ではあるが言語によって記述が異なってくるから汎用的とは言えない
    この質問者がどのような趣旨で質問しているかを再度確認するとよいでしょう

    rubyを使い始めている人にとってはよい教材になると思いますが書く場所を間違ったようには思います
  • id:lunlumo
    そうですか?それ程的を外した回答とは思いませんが。

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

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

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

回答リクエストを送信したユーザーはいません