以前からワイルドカードの記述で {1,} と @ に違いを認識しながら、明確にその差を理解していませんでした。ちょうどSNSで話題になったため、調べてみましたので、その結果を以下にまとめておきます。
{1,} でダメで @ ならうまく行くケース
例えば、英単語のing形を検索してヒットさせるワイルドカードを考えるとき、以下のような記述を思い付くと思います。
[A-Za-z]{1,}ing
しかし、これではまったくヒットしません。WildLight辞書ライブラリーにある「WLDIC_ECHK_簡易技術英文チェック.txt」で、これを検索するワイルドカードの記述がありますが、以下のように記述します。
[A-Za-z]@ing
そもそも、{,}と@の意味は、ワードの以下の説明から理解しています。
差が良く分からないですよね。{1,} と @ が同じ動きをするという解釈自体が間違っているのかもしれません。
{1,} と @ による検索の動きがどう違うのかを実際にMicrosoft Wordで見てみました。
以下の英文をサンプルにして、{1,} と @ で検索の違いを見てみます。
ヒット数の違いに着目してみます。
{1,}
27件がヒットしています。
@
155件がヒットしています。
実は、27件というのは単語数と同じ、155件は文字数と同じです(カンマ、コンマを含まず)。
どうも @ は1文字ずつヒットするようです。実際にどのような検索範囲になるのかを見てみると、以下のようになります。
{1,}
@
やはり、前者は単語単位、後者は文字単位でヒットしていることが分かります。
さて、元に戻って、 {1,} ではダメで @ ならうまく行く理由を知りたいのですが、例として上記サンプル英文の「example」を利用して検索してみます。
[A-Za-z]{1,}ple
もちろん、これでは、まったくヒットしません。これを以下のように変えてみたらヒットしました。
[A-Za-z]{1,4}ple
これを「[A-Za-z]{1,3}ple」にすれば「xample」、「[A-Za-z]{1,2}ple」にすれば「ample」、「[A-Za-z]{1}ple」にすれば「mple」がヒットしますが、次の記述だとヒットしなくなります。
[A-Za-z]{1,5}ple
{1,5}の5を4より大きな数字にすると、まったくヒットしなくなります。これは{n, m}のmの数字に影響を受けていることになります。pleの前にm個分の文字が存在しないとヒットしないということのようで、{1,}では無限大の文字数ということになり、何もヒットしないのでしょう。
ところが ple を半角スペースにすると、「[A-Za-z]{1,} 」でも文字数に関係なくヒットするのです。もしかすると{1,}の後の文字数の問題かと「[A-Za-z]{1,}e」を試しましたが、まったくヒットしません。
ん~、良く分かりません。
誰か、この辺りを説明できる方、教えてくださいm(_ _)m
==== < 2019/05/04 17時追記> ====
早速、SNSで反応をいただきました。
{1,}は、先行するパターンがマッチする範囲で一番長い部分で一致し (最長一致)、@は、全体のパターンがマッチする一番短い部分で一致 します(最短一致)
ということで、検索挙動の違いは、この説明通りですね。
また、「[A-Za-z]{1,}ple」の場合、「example」まで最長で一致し、その後に「ple」を探すため、マッチしないという現象になるようです。
情報をくださった方、ありがとうございました。