\b\w+(?<!s)\b
。これは間違いなくと同じではありません\b\w+[^s]\b
。に適用するJon's
と、前者が一致Jon
し、後者Jon'
(アポストロフィを含む)が一致します。理由を理解するのはあなたに任せます。(ヒント:\ bはアポストロフィとsの間で一致します)。後者は、「a」や「I」などの1文字の単語とも一致しません。
理由を説明できますか?
\b
また、正確に何をするのか、なぜアポストロフィとアポストロフィが一致するのかを明確にできますs
か?
\b\w+(?<!s)\b
。これは間違いなくと同じではありません\b\w+[^s]\b
。に適用するJon's
と、前者が一致Jon
し、後者Jon'
(アポストロフィを含む)が一致します。理由を理解するのはあなたに任せます。(ヒント:\ bはアポストロフィとsの間で一致します)。後者は、「a」や「I」などの1文字の単語とも一致しません。
理由を説明できますか?
\b
また、正確に何をするのか、なぜアポストロフィとアポストロフィが一致するのかを明確にできますs
か?
\b
単語の境界を意味するゼロ幅のアサーションです。これらの文字の位置(そのリンクから取得)は、単語の境界と見なされます。
- 文字列の最初の文字の前。最初の文字が単語文字の場合。
- 文字列の最後の文字の後、最後の文字が単語文字の場合。
- 文字列内の2つの文字の間。一方は単語文字で、もう一方は単語文字ではありません。
単語の文字はもちろん任意\w
です。s
は単語の文字ですが、'
そうではありません。上記の例では、'
との間の領域s
は単語の境界です。
アンカーと境界を強調表示すると、文字列"Jon's"
は次のようになります(最初と最後\b
のはとと同じ位置に^
あり$
ます):^Jon\b'\bs$
ネガティブルックビハインドアサーションは、文字が前に付いていない場合(つまり、最後の単語の文字がではない場合)にのみ単語の境界に(?<!s)\b
一致することを意味します。そのため、特定の条件下で単語の境界を探します。s
s
したがって、最初の正規表現は次のように機能します。
\b\w+
最初の3文字に一致しJ
o
n
ます。
上記のようにn
との間には実際には別の単語境界があります。この単語境界は、前に。ではなく、が付いているため、この単語境界と一致します。'
(?<!s)\b
n
s
パターンの終わりに達したので、結果の一致はJon
です。
補完的な文字クラスとは、文字以外の文字[^s]\b
と一致し、その後に単語の境界が続くことを意味します。上記とは異なり、これは1つの文字とそれに続く単語の境界を検索します。s
したがって、2番目の正規表現は次のように機能します。
\b\w+
最初の3文字に一致しJ
o
n
ます。
は文字で'
はなくs
(文字クラスを満たす[^s]
)、その後に単語の境界('
との間s
)が続くため、一致します。
パターンの終わりに達したので、結果の一致はJon'
です。すでに一致する前の単語境界のため、文字s
は一致しません。
この例では、先読みと後読みを使用して「and」条件を作成できることを示しています。
\b\w+(?<!s)\b
次のように書くこともできます
\b\w*\w(?<!s)\b
それは私たちに与えます
\b\w*[^s]\b vs \b\w*\w(?<!s)\b
私はそれをしたので、無関係なものを無視することができます。(\b
この例では単に気を散らすものです。)
[^s] vs \w(?<!s)
左側では、「s」以外の任意の文字に一致させることができます
右側では、「s」以外の任意の単語文字に一致させることができます
ところで、
\w(?<!s)
書くこともできます
(?!s)\w # Not followed by "s" and followed by \w