正規表現の.*と*の違い

正規表現の.*と*の違い

以下を含む「test」というファイルがあります。

linux
Unixlinux
Linuxunix
it's linux
l...x

これで:を使用すると、grep '\<l.*x\>'次のようになります。

linux
it's linux
l...x

ただし、を使用すると、grep '\<l*x\>'次のように一致します。

l...xただし、リファレンスガイドによると、*を使用すると、前の項目が0回以上一致します。つまり、「l」で始まり「x」で終わるものと一致する必要があります。

期待した結果が表示されない理由を説明できる人はいますか?それとも私が間違って理解していますか?

答え1

シンボル(.*)

正規表現の * と * は、文字当たりの文字数ではなく、数を意味し、より正確には意味します。「0個以上」。また、方法「すべての単一文字」

だからそれらを合わせると「0個以上の文字があります。」。たとえば、次の文字列は次のようになります。

  • Linux
  • リンNx
  • lnx
  • ハイLinux
  • ラックス

と一致します<l.*x>。最後の項目が重要であることを示します。.*やはり一致できません。

シンボル(*)

私が言ったように、*だけがカウンターです。したがって、文字の後に入れると、次のようになります。「エル」*言う「0個以上のl」

grep は と一致しますが、考え方とl*x異なるl...x場合があります。

% echo "l...x" | grep "l*x"
l...x

末尾の「x」と一致します。 「l」は、「x」の前に「x」があることを除いて、一致理由とは何の関係もありません。「0個以上のl」

答え2

「l」で始まり、「x」で終わるすべての項目を一致させるには、正規表現「l.*x」を使用します。ここで「。」 「*」および「*」は、それぞれ有効な単一文字と長さが0以上の文字を表す特殊文字です。ここで「*」の前には「.」があるので、「.」を置き換えることができる項目は何でも可能です。上記の「*」定義に従って繰り返します。

答え3

シェル(bashなど)の場合、clownはファイル名を一致させるために使用され、文字自体の場合は文字を表します*?

一方、正規表現の場合、、、*(発生範囲)および(のみ)?はそれ自体では何もありません。常に前の文字/原子を参照してください。実際の文字(例えば、または)であるかどうかにかかわらず、(ジョーカー)は、すべての文字、文字範囲(たとえば)、または複数の文字のパターン(egrepのみです。 。したがって、それ自体は何の意味もありませんが、前の文字(1つの単位と見なされる人またはグループの道化師かもしれません)が何回繰り返されるべきかを教えてください。{n,m}+egrepL5.[a-f](abba)*?

*シェルと正規表現の使用方法の違いを覚えておくと?わかります。

したがって、正規表現の場合:

  • .- すべての文字の正確に一度の発生を示します。
  • a..a- 2つのaとその間のすべてのタイプの2つの文字に一致します。
  • .*- すべての文字が0個、1個以上一致します。
  • B*- 「B」が0、1個以上一致します。

関連情報