重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

正規表現の最短マッチについて教えてください。
以下のような文字列を正規表現を使ってマッチさせます。
まず、検索ボックスに 「".+"」と入力します。
すると一番左端のダブルクォーテーションから、右端のダブルクォーテーションまで全てが選択されます。解説によると量指定子はデフォルトだとなるべく長い文字にマッチされるとのことです。

"apple", "apples", "pineapple"

で、一番短い文字列でマッチさせたい場合は量指定子の後に「?」をつけてやるといいようです。
実行してみると添付画像のように各々の文字列が別個に選択されています。

初心者の素朴な疑問なのですがダブルクォーテーションで囲んだ文字列と文字列の間のカンマはマッチしないのでしょうか?

「".+?"」だとカンマは任意の一文字として該当しないのですか?

apple「", "」apples「 ","」pineapple

学習はじめたばかりの初心者です。少し混乱しています。どなかた分かりやすく教えてください。よろしくお願いいたします。

最短マッチということで["apple"]、["apples"]、["pineapple"]よりもダブルクォーテーションで囲まれた「[", "][", "]こちらの方が短いのではないかと素人目に思えてしまいます。

「正規表現の最短マッチについて教えてくださ」の質問画像

A 回答 (2件)

最短マッチの意味の誤解です。


「マッチする全ての中で一番短い物」ではないです。

まず、左端が固定されます。
「"apple"」の左の「"」と、「".*?"」の左の「"」ですね。
次に、「"a」「"ap」・・・と1文字ずつ延ばしながら最初にマッチしたものを採用するというのが最短マッチの意味です。
左端を固定した状態で延ばしながら何度かマッチしても止めずに繰り返し、最後にマッチしたのもを採用するのが最長マッチ「".*"」です。

で、マッチした文字列「"appple"」は検索対象文字から取り除かれ、その次の文字である「,」から次の探索が始まり、正規表現の左端である「"」が探されます。
つまり、同じ文字がマッチしたとして複数回選択されることは無いです。
    • good
    • 0

「".+?"」はまず「"apple"」にヒットします。

ヒットした次の文字から
再検索をはじめるので「,」には反応しません
「"」にかこまれた文字をすべてヒットさせたいならこうします
(javascript)
var str=`"apple", "apples", "pineapple"`;
var reg=/(?<=").+?(?=")/g;
console.log(str.match(reg));
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!