質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • 正規表現

    811questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

正規表現のキャプチャについて

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 257

weak-bear

score 2

同一文字の繰り返しを正規表現で作ろうとして
キャプチャ(後方参照)について勉強し作ってみたのですが
実行した後キャプチャの定義が曖昧になってしまったため
詳しい方教えてください。

[課題]
同一文字の繰り返し(a-zA-Z0-9の2回以上の繰り返し)

[答え]
([a-zA-Z0-9])\1+
↑2回以上の繰り返し

[自分の考え]
([a-zA-Z0-9])\1{2,}
↑([a-zA-Z0-9])\1の部分で1文字を後方参照し表現するわけだから
{2,}をつけるのが正解だと思っていた
*実行すると([a-zA-Z0-9])\1で2文字の繰り返しが表現されていた

[その他正規表現]サクラエディタで動作を確認
([a-zA-Z0-9])\1 ←部分一致のため+なくても繰り返しとなる?
[a-zA-Z0-9]+ ←「\」がないとちゃんと1文字以上の繰り返しとなる(同一文字の繰り返しではないが)
[a-zA-Z0-9]{2,} ←2文字以上の繰り返しとなる(同一文字の繰り返しではない)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

 キャプチャ

[答え]
[a-zA-Z0-9]\1+

キャプチャしているように読めないのですが、文字クラスを自動的にキャプチャする実装があるのでしょうか。
JavaScript では次のように書きます。

/([a-zA-Z0-9])\1+/.exec('aaaaaa');  // ["aaaaaa", "a", index: 0, input: "aaaaaa", groups: undefined]

 消費している回数

↑[a-zA-Z0-9]\1の部分で1文字を後方参照し表現するわけだから
{2,}をつけるのが正解だと思っていた

[a-zA-Z0-9] によって、「一度消費している」のですから、\1 は2回目の消費です。
要求仕様が「2回以上の繰り返し」なら、\1 は1を差し引いて「1回以上の繰り返し」にしなければなりません。


コードを書いて、比較検証してみる事をお勧めします。

console.log(/([a-zA-Z0-9])/.exec('aaaaaa')[0]);    // "a"
console.log(/([a-zA-Z0-9])\1/.exec('aaaaaa')[0]);  // "aa"
console.log(/([a-zA-Z0-9])\1+/.exec('aaaaaa')[0]); // "aaaaaa"


Re: weak-bear さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/10 21:45

    すみません、()つけるの忘れていました。新しく質問上げることにします。
    「()¥1」で1回以上の繰り返しで「+」をつけることで2回以上の繰り返しとなるということでしょうか?

    キャンセル

  • 2018/06/10 21:50

    ([a-zA-Z0-9]) と \1 で2回消費される、という意味です。

    キャンセル

  • 2018/06/13 08:33

    ([a-zA-Z0-9])で1文字、¥1で後方参照された文字よって1+1の文字で+を付けることで2以上の文字になるということでしょうか?

    キャンセル

  • 2018/06/13 09:03

    はい。その通りです。

    キャンセル

0

()によるキャプチャと\1の関係を妙にセットでとらえすぎているのかなと思います。

\1はここでは[a-zA-Z0-9]にマッチした文字列に置き換わるわけです。一方、キャプチャされた部分は、キャプチャのあるなしにかかわらず正規表現の一部として機能します。そう考えれば、([a-zA-Z0-9])\1で「同じアルファベット化数字の2回繰り返し」になるのは当然の結果ですよね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/13 08:30

    つまりキャプチャによるマッチした文字+キャプチャされてたマッチした文字により2文字が表現されるということでしょうか?
    後方参照の範囲+後方参照された文字という解釈で良かったですか?

    キャンセル

  • 2018/06/13 11:43

    それでいいと思います。正直、なにが引っかかっているのかがわかりません。

    キャンセル

0

Aの2回以上の繰り返し」がAA+だと思うか、AA{2,}だと思うか、どちらですか?
これと、質問内容は繰返し回数に関して同じことですか?違うことですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/12 00:24

    AA+もAA{2,}も一緒じゃないんですか?正規表現、初心者のためそこの違いもよくわかっておりません、

    キャンセル

  • 2018/06/12 00:38

    初心者とか言うレベルの話じゃ無いです。
    Aは何個ですか?AAは何個ですか?というレベルの話をしています。

    キャンセル

  • 2018/06/12 00:52

    「りんごが1個」と「りんごが1個以上」を足し算したらどうなりますか。
    「りんごが1個」と「りんごが2個以上」を足し算したらどうなりますか。

    キャンセル

  • 2018/06/12 08:38

    …AA…、…AAA…など2個以上の繰り返しをヒットさせたいと思っております。AAの繰り返しではなくAが2以上繰り返しの正規表現で質問は「何故キャプチャしたら2文字連続したものになるのか」です。説明下手ですみません。

    キャンセル

  • 2018/06/12 08:45

    1個+1個以上=2個以上
    1個+2個以上=3個以上
    というのはわかりますでしょうか?
    なので、2個以上にしたい場合は、「1個+1個以上」を使います。

    キャンセル

  • 2018/06/12 08:50

    ですから、上に書いた通りなんですが、なぜ答えて貰えないのでしょうか…。

    「りんごが1個(A)」と「りんごが1個以上(A+)」を足し算したらどうなりますか。 AA+
    「りんごが1個(A)」と「りんごが2個以上(A{2,})」を足し算したらどうなりますか。 AA{2,}

    それと、私の回答の方にも返信がほしいのですが…。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • 正規表現

    811questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。