none
正規表現で@から始まる文字列を抜き出したい RRS feed

  • 質問

  • いつもお世話になっております。

    @または@から始まる文字列を抜き出したいと思っております。
    そこでプログラムを書いてみたのですが、
    私の意図したように正規表現を書けないため、
    質問させて頂きました。

    たとえば以下のような文字列があったとします。
    ----------------------------------------------
    @abc@def あいう @あいう
    @あいう えお
    @(111) (abc) (あいうえお)
    @亜伊
    ----------------------------------------------

    その場合に、以下のように抜き出したいのです。
    ----------------------------------------------
    @abc
    @def
    @あいう
    @あいう
    @(111)
    @亜伊
    ----------------------------------------------

    正規表現としては、
    先頭が@または@で
    その後@または@のあとに文字列があり、
    終わりは次の文字が出てきたときだと思っています。
    @、@、半角スペース、全角スペース、改行

    それでは、と思い正規表現を書いてみました。
    ----------------------------------------------
    (@|@).*(@|@| | |\n)
    ----------------------------------------------

    しかし、これでは以下のように抜き出されてしまいます。
    ----------------------------------------------
    @abc@def あいう @あいう
    @あいう えお
    @(111) (abc) (あいうえお)
    ----------------------------------------------

    原因は1番長い範囲で文字列が抜き出されるためでしょうか。
    また最後の「@亜伊」も、その後に続く文字がないため、
    抜き出すことができませんでした。

    この場合、どのような正規表現を書けばよいのでしょうか?
    もしよろしければ、ご教示頂けませんか?
    ぜひよろしくお願いいたします。

    • 編集済み コンドル 2009年11月4日 6:04 抜き出したあとの求める結果が間違っていたため。
    2009年11月4日 5:11

回答

  • こんにちは。

    過去に正規表現で同じように最小の範囲でうまく文字列を取り出せず、
    悩んだことがあります。

    そのときは、区切りの部分で文字列を置換し、うまく取り出せるように前処理をすることで対応しました。

    試していませんが、
    @または@の前に改行を入れ、
    @((@|@)(.)+\n)
    でしょうか?

    • 回答としてマーク コンドル 2009年11月4日 6:04
    2009年11月4日 5:39
  • @"(@|@)[^@@\s]+" ではどうでしょうか。
    • 回答としてマーク コンドル 2009年11月4日 8:04
    2009年11月4日 7:32
  • どうせなら
    @"([@@][^@@\s]+)"
    かな。Groups[0]を使うのなら()もいりませんね。
    • 回答としてマーク コンドル 2009年11月5日 11:08
    2009年11月4日 11:05

すべての返信

  • こんにちは。

    過去に正規表現で同じように最小の範囲でうまく文字列を取り出せず、
    悩んだことがあります。

    そのときは、区切りの部分で文字列を置換し、うまく取り出せるように前処理をすることで対応しました。

    試していませんが、
    @または@の前に改行を入れ、
    @((@|@)(.)+\n)
    でしょうか?

    • 回答としてマーク コンドル 2009年11月4日 6:04
    2009年11月4日 5:39
  • SweetSmile様

    ご回答ありがとうございます。

    >そのときは、区切りの部分で文字列を置換し、うまく取り出せるように前処理をすることで対応しました。
    大変参考になりました。
    処理しやすいように置換してあげれば良いんですね。
    その発想がありませんでした。

    >試していませんが、
    >@または@の前に改行を入れ、
    >@((@|@)(.)+\n)
    >でしょうか?
    これではダメそうでしたが、
    @、@の前に改行を入れて、
    さらに半角スペース、全角スペースの前に改行を入れて、
    最後の文字のあとにも改行を入れれば、

    (@|@).*

    でいけそうな感じです。
    (微調整は必要かもしれません。)

    大変参考になりました。
    ありがとうございました。

    2009年11月4日 6:00
  • @"(@|@)[^@@\s]+" ではどうでしょうか。
    • 回答としてマーク コンドル 2009年11月4日 8:04
    2009年11月4日 7:32
  • siokoshou様

    ご回答ありがとうございました。
    望んでいた結果が得られました。

    \sで
    ⇒空白文字(スペース、復帰文字、タブ、改行文字、ラインフィード)
    という意味なのですね。
    とても勉強になりました。

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

     

    2009年11月4日 8:04
  • どうせなら
    @"([@@][^@@\s]+)"
    かな。Groups[0]を使うのなら()もいりませんね。
    • 回答としてマーク コンドル 2009年11月5日 11:08
    2009年11月4日 11:05
  • 佐祐理さん

    ご回答ありがとうございます。

    先頭の文字の部分を変更されたのですね。
    このような方法もできますね。
    勉強になります。

    スマートで分かりやすいと思いましたので、
    使用させて頂きました。

    ありががとうございました。
    2009年11月5日 11:08