ハイフンを正規表現と一致させる方法は?


83

[a-zA-Z0-9!$* \t\r\n]既存の文字と一緒にハイフンに一致するようにパターンを書き直す方法は ?


スペースと\ tを追加する代わりに、\ sを追加できます。\ sは、他の種類の空白にも一致します
Radu Simionescu 2015年

回答:


72

ハイフンをエスケープします。

[a-zA-Z0-9!$* \t\r\n\-]

更新
この回答は気にしないでください。グループにハイフンを追加できますが、エスケープする必要はありません。代わりに、Konrad Rudolphの回答を参照してください。これは、はるかに優れた回答を行い、その理由を説明しています。


ああ?それはキャラクターグループに属しているからですか?私の悪い。
Neil Barnwell 2010年

11
@KonradRudolphあなたは正しいですが、エスケープされていないバージョンの方が理解しやすいかどうかはわかりません。ダッシュの2つの可能な使用法は紛らわしいです、これはこれについて最初に質問がある理由です。一度知ってしまえば確かにエレガントですが、初心者にとっては少し紛らわしいです。
Christophe Roussy 2014

186

ハイフンは通常、正規表現では通常の文字です。それがキャラクタークラスにあり、他の2つのキャラクターの間にある場合にのみ、特別な意味を持ちます。

したがって:

  • [-] ハイフンに一致します。
  • [abc-]マッチabcまたはハイフン。
  • [-abc]マッチabcまたはハイフン。
  • [ab-d]マッチabcまたはdここでしかハイフンは、文字の範囲を表します)。

1
@rrrあなたは彼にあなたのためにそれを書いてもらい、それを綴ってもらいたいですか?あなたがする必要があるのは、グループにハイフンを追加することです。
Neil Barnwell 2010年

10
@rrrr:私は答えを出したと信じています。質問は「「X」の書き方…」でしたが、その方法を説明したと思います。私の答えを取り、手元の実際の表現に説明を適用することは、1年生に必要とされる以上の認知スキルを必要としないはずです。実際には、これはまさに最初年生が、彼らは基本的な算術を教えている時に行うことを学びました。私の仮定を自由に訂正してください。
Konrad Rudolph


2
@MarkPええと、文字の16進コードは、フロントエンドパーサー(C#、JavaScript、または使用している言語)によって実際の文字に変換されます。したがって、16進コードを使用することは、文字列の値に関する限り、実際の文字を使用することと同じです。
Konrad Rudolph

1
@Pshemoもちろん、ばかげた間違い。の解釈に関して[a-c-e]:これは一部の正規表現仕様/エンジンでは単に無効です。たとえば、POSIX正規表現はそれを許可しません。
Konrad Rudolph

13

常にエスケープされたハイフンを使用する方が混乱が少ないため、位置に依存する必要はありません。これ\-は、括弧で囲まれた文字クラスの内側です。

しかし、考慮すべきことが他にあります。それらの列挙された文字のいくつかは、おそらく異なって書かれるべきです。状況によっては、間違いなくそうすべきです。

この正規表現フレーバーの比較は、C♯がより単純なUnicodeプロパティのいくつかを使用できることを示しています。Unicodeを扱っている場合は、考え\p{L}られるすべての文字、およびおそらく \p{Nd}10進数に一般カテゴリを使用する必要があります。また、HYPHEN-MINUSだけでなく、すべてのダッシュ句読点に対応する場合は、\p{Pd}プロパティを使用する必要があります。また\s、あまり一般的ではないと仮定して、空白文字のシーケンスを単純にとして記述したい場合もあります。

全体として[\p{L}\p{Nd}\p{Pd}!$*]、それはそのセットの任意の1文字に一致するパターンになります。

とにかく、完全なUnicodeセットを扱う予定がなかったとしても、それを使用する可能性があります。これは、始めるのが良い習慣であり、これらのものが元のパラメーターを超えることが多いためです。これで、他のコードで使用するために持ち上げても、正しく機能します。すべての文字をハードコーディングすると、ハードコーディングされません。


私はこの答えに同意する傾向がありますが、コードの安全性を知る必要が少なくなります。これは、オペレーターの優先順位の問題を思い出させます:stackoverflow.com/questions/10007140/…、括弧が含まれていると思います(IDEによって自動的に追加されます)。すべてを知る必要はありません。あなたや他の誰かが遅かれ早かれ混乱するかもしれません。もちろん、プロジェクトで正規表現を頻繁に使用する場合は、より高度な知識が必要になる場合があります。
Christophe Roussy 2014

4

[-a-z0-9] +、[a-z0-9-] +、[az-0-9] +および[az-0-9] +はすべて同じです。2つの範囲の間のハイフンはシンボル。また、[a-z0-9-+()] +この正規表現はハイフンを許可します。


最良の答えの1つである必要があります。
Razor's Edge

3

これはあなたが求めているものですか?

MatchCollection matches = Regex.Matches(mystring, "-");

1

引用符なしで「\ p {Pd}」を使用して、任意のタイプのハイフンに一致させます。「-」文字はハイフンの一種であり、正規表現では特殊文字でもあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.