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

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

新規登録して質問してみよう
ただいま回答率
85.49%
正規表現

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

Q&A

3回答

352閲覧

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

weak-bear

総合スコア8

正規表現

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

0グッド

0クリップ

投稿2018/06/10 12:28

編集2018/06/10 12:52

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

[課題]
同一文字の繰り返し(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文字以上の繰り返しとなる(同一文字の繰り返しではない)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2018/06/10 16:40

otn

総合スコア84491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

weak-bear

2018/06/11 15:24

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

2018/06/11 15:38

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

2018/06/11 15:52

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

2018/06/11 23:38

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

2018/06/11 23:45

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

2018/06/11 23:50

ですから、上に書いた通りなんですが、なぜ答えて貰えないのでしょうか…。 「りんごが1個(A)」と「りんごが1個以上(A+)」を足し算したらどうなりますか。 AA+ 「りんごが1個(A)」と「りんごが2個以上(A{2,})」を足し算したらどうなりますか。 AA{2,} それと、私の回答の方にも返信がほしいのですが…。
guest

0

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

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

投稿2018/06/10 13:24

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

weak-bear

2018/06/12 23:30

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

2018/06/13 02:43

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

0

キャプチャ

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

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

JavaScript

1/([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] によって、「一度消費している」のですから、\12回目の消費です。
要求仕様が「2回以上の繰り返し」なら、\1 は1を差し引いて「1回以上の繰り返し」にしなければなりません。


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

JavaScript

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

Re: weak-bear さん

投稿2018/06/10 12:38

編集2018/06/11 15:50
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

weak-bear

2018/06/10 12:45

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

2018/06/10 12:50

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

2018/06/12 23:33

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

2018/06/13 00:03

はい。その通りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問