• ベストアンサー

正規表現の例外表記は?

pacman_chieの回答

  • ベストアンサー
回答No.1

除外とは微妙に異なりますが、「~という表現が続かない位置」」を意味する、「否定先読み」があります。 (?!ああああああ))[あ(]{5}あ) もっと単純にした方が確実になり、不一致複数カッコにも対応します。 (?:(あ{5}|あ(あ{4}|あ{2}(あ{3}|あ{3}(あ{2}|あ{4}(あ)) ------------------------------------------------------------ >(あああああ)~ああああ(あ)までカッコが最低1つ含むもの >全てが「あ」の「ああああああ)」のみを除外 以下のように理解しておきました。 正規表現をリクエストする際は、このようにマッチ例のリストを豊富に提示すると要望が確実に伝わり、回答者が楽です。 例 1. りんご(あああああ)みかん 2. りんごあ(ああああ)みかん 3. りんごああああ(あ)みかん 4. りんごああああああ)みかん 期待するマッチ結果 1. (あああああ) 2. あ(ああああ) 3. ああああ(あ) 4. マッチしない

ponsuke_21
質問者

お礼

ありがとうございます。 これで何とか形になりそうです。 「先読み」「後読み」「否定」「肯定」の理解を深めることが正規表現を理解する上で最大のポイントであることがわかりました。

関連するQ&A

  • 正規表現

    いつもお世話になっております。 早速質問させていただきます。 文字列中に {{○}} を検索し、マッチさせるための 正規表現を教えてください。 (中括弧×2 英数字 中括弧×2) ○には、英数字が入る可能性がございます。 {{○}} は複数個あるかもしれないので、preg_match_all() を 使用したほうがいいかと考えております。 よろしくご教示お願いいたします。

    • ベストアンサー
    • PHP
  • ruby 正規表現

    こんばんは。 Rubyでの正規表現での質問なのですが、 例えば"hoge"という文字が含まれる行全体にマッチさせるような正規表現は存在するのでしょうか? また存在する場合はどのように記述すれば良いのでしょうか。 単純な質問で申し訳ありませんが、よろしくお願いいたします。

  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • 以下の場合の正規表現の書き方を教えて下さい。

    以下の場合の正規表現の書き方を教えて下さい。 「XXXにはマッチするがXXXYYYにはマッチしない」を一つの正規表現文字列で実現するには、どう記述すればよいですか? 例えば、「マイナス」にはマッチするが、「マイナスイオン」はマッチさせたくない場合です。 この例の「イオン」の部分は今のところ一種類で良いのですが、もし可能でしたら複数種のワードに対応できると嬉しいです。(マイナスイオンに加えて、「マイナスドライバー」もマッチしないなど) なんか間抜けな質問ですがよろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現で「)」がメタ文字の理由?

    Perlの正規表現で、「)」(カッコ閉じ)は、「(」(カッコ開け)同様メタ文字で、もし/)/のようなマッチ演算子を書いて、「)」という文字列を検索しようとすると、Unmatched ) in regexというエラーになります。 しかし、「]」(角カッコ閉じ)や、「}」(中かっこ閉じ)は、メタ文字ではなく、/]/、/}/のようなマッチ演算子は正当で、それぞれ]、}をきちんと検索するのです。 「[」(角カッコ開け、文字クラスを作る)や、「{」(中かっこ開け)はメタ文字なのに、です。 開けがこないのに閉じが来た場合、]と}はエラーにならないのに、)だけはエラーになります。 これは、なぜでしょうか。

    • ベストアンサー
    • Perl
  • 正規表現検索

    Javaのソースコード内から特定の単語を検索したいのですが、 このとき、以下の条件があります。 (1)ブロックコメント内を無視する (2)行コメント内を無視する (3)変数文字列内を無視する 01 /* 02 * ここの abc はブロックコメント内なので無視する 03 * 04 */ 05 public class Foo() { 06  private int abc = 0; 07 08  public Foo() { 09   // 行コメント内なのでここの abc を無視 10   abc = 1; 11   String s = "変数文字列内の abc これも無視"; 12  } 13 14  public String get() { 15   return " 1'23\" abc " + abc; // この場合後ろの abc のみヒット 16  } 17 } 例えば、上記のテキストで abc を検索したとき、 6、10と15行目の後ろの3箇所のみヒットさせたいのですが、 これはどのように正規表現で記述すればよいのでしょうか。 /* で始まり、*/ が記述されるまでがブロックコメントです。 // があったら、その行末までが行コメントです。 " で囲まれた中が変数文字列です。文字列内の \" は無視します。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

  • 金額にマッチする正規表現について

    ある、複数行の文章内に散在する 最低4桁以上の金額を全て抽出するには? 例えば \#### \####- ####円 と、それぞれ3桁を「,」で区切った数値を金額とみなす場合 1度のパターンマッチで、 上記3つのバリエーションとカンマ付き全種の 不純物が入らない厳密なパターンを記すことは、できますでしょうか? 追記、 以下のような場合は金額とみなしません。 ####(金額に関する記号が前後に付かないため) ####-(頭に\が足りないマイナス単独なため) ###(3桁しかないため) # ###(数値の間の区切りがカンマ以外のため)

    • ベストアンサー
    • Perl
  • 【ACCESS】クエリで正規表現の論理和について

    いつもお世話になります。 ACCESSのクエリで下記の2つの文字列にマッチする正規表現は どのように書けばよいのでしょうか。 ・20110101 ・20111231 下記の通り書いてみましたが、うまくいきませんでした。 どうやら、論理和「|」やグループの括弧「()」を記述するとNGみたいなのですが。。 使えないのでしょうか。 SELECT IIf (a.date Like '[1-9][0-9][0-9][0-9] (0[1-9] | 1[012] )', a.date, '') FROM a; 上記クエリでは、テーブルaからdate列(文字列)を抽出する際、 パターンにマッチすればその値を返し、マッチしなければ空白を返させようとしました。 結果は空白が返ってしまいました。 何かお気づきの点があれば、教えていただきたく存じます。 以上、よろしくお願いします。

  • 正規表現の空白文字について

    Javaで正規表現を使って文字列のマッチング処理を勉強しています。 パラメータで渡されてきた値に"name="と入っている場合、マッチOKに したいのですが、 "name" と "="の間には、全角、半角スペースが複数混在している可能性があり、 その場合もマッチOKにしたいです。 アドバイスをお願いします。 ・マッチOKにしたい文字列  name=  name =  name =  name  =  name   =  など。 name" と "="の間には、全角、半角スペースが複数存在している可能性あり。 スペースなし(name=)の場合もマッチOKにしたい。 以下のようにすると全角のみ、半角のみのスペースなら1文字以上入っていても マッチOK(スペースなし(name=)の場合もマッチOK)ですが、 全角と半角のスペースが混在してしまうとマッチOKになりません。 String param = "name=mike"; Pattern p = Pattern.compile("name( *?|\\s?)=", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(param);

    • ベストアンサー
    • Java