正規表現の^ s $が「sで始まりsで終わる」などの文字列と一致しないのはなぜですか?

正規表現の^ s $が「sで始まりsで終わる」などの文字列と一致しないのはなぜですか?

^行の先頭と一致し、行$の終わりと一致した場合、行^$の先頭ではないのはなぜですか?そしてタイトルのように文字列の終わりですか?

次のように文字列に一致する正規表現を作成する方法は次のとおりです。

「で始まり、でs終わりますs。」

答え1

その理由は、正規表現の一致が処理される方法にあります(参照:ここたとえば、文字列は左から右に評価され、逆参照を除いて、文字列内のすべての記号は正規表現のトークン(最も単純な場合はリテラル記号自体)と一致する必要があります。反復演算子。

鍵となるのは、正規表現が「文字列全体の一般属性」(例:「s開始と終了」)を記述するのではなく、文字列にルールを適用することです。キャラクターレベルひも。だから、あなたの正規表現

^s$

意味:「文字列の始まり」、その後に一つ s、その後に「文字列の終わり」が続きます。したがって、これは単一の文字で構成される文字列にのみ一致しますs。これは技術的に始めて終わる文字列ですが、sユーザーが探している文字列ではありません。

sで始まり、途中に文字があり、で終わる文字列を一致させるには、sその文字列をすべて明示的に指定する必要があります。

非常に明確にするには:

  • 最初の反復は次のとおりです。
    ^s.*s$
    
    sこれは、「で始まり、その後にランダム型のゼロ文字以上の文字(.*)が続き、最後にs文字列の終わりになる文字列と一致します。
  • もちろん、これはいいえ次の文字列と一致します。ただ数値s。したがって、2番目の反復では、最初のオプションセクションの後にセクションを設定しますs(@user414777の説明を参照)。
    ^s(.*s)?$
    
    sこれは、「で始まり、ゼロまたは1回(the ?)」、すべての種類の0個以上の文字で構成される部分文字列、「(sの内容(...))が続き、直後に終わる文字列」と一致します。

これで質問にタグを付けたことは、おそらく行または文字列が始まり終わった場合にのみ適用されるルールの条件を生成することawkです。これは次のようになります。awks

awk '/^s/ && /s$/ { ... }'

grepようなそして- 構築自体が不可能(構文は次のとおり)-e regex1 -e regex2または)、しかしパイプを介してこれを行うことができます。

grep "^s" sourcefile.txt | grep "s$"

関連情報