単語境界で終わる式に一致する正規表現が必要ですが、ハイフンを境界とは見なしません。つまり、一致するすべての式を取得します
type ([a-z])\b
しかし、一致しません。
type a-1
[A-Za-z0-9_]
言い換えると、単語 character classを使用する代わりに、拡張クラスを使用する単語境界演算子 \b に相当するものが必要です。[A-Za-z0-9_-]
単語境界で終わる式に一致する正規表現が必要ですが、ハイフンを境界とは見なしません。つまり、一致するすべての式を取得します
type ([a-z])\b
しかし、一致しません。
type a-1
[A-Za-z0-9_]
言い換えると、単語 character classを使用する代わりに、拡張クラスを使用する単語境界演算子 \b に相当するものが必要です。[A-Za-z0-9_-]
これには先読みを使用できます。最短は、否定的な先読みを使用することです。
type ([a-z])(?![\w-])
(?![\w-])
\w
は、「次の文字が " にある場合、または" である場合、一致に失敗する」ことを意味し-
ます。
以下は、通常の先読みを使用するオプションです。
type ([a-z])(?=[^\w-]|$)
「次の文字が文字クラスにない場合、またはこれが文字列の最後である(?=[^\w-]|$)
場合にのみ一致する」と読むことができます。[\w-]
動作を確認してください: http://www.rubular.com/r/NHYhv72znm
「*」を境界文字と見なしたくないことを除いて、かなり似た問題がありました。これが私がしたことです:
\b(?<!\*)([^\s\*]+)\b(?!*)
基本的に、単語の境界にいる場合は、1 文字戻って、前の文字が「*」だった場合は一致しません。中間の場合は、スペースやアスタリスクで一致させないでください。最後にいる場合は、最後がアスタリスクでないことを確認してください。あなたの場合、\s の代わりに \w を使用できると思います。私にとって、これは次の状況で機能しました。
*word
wo*rd
word*