文字列全体を正規表現と一致させるにはどうすればよいですか?


82

文字列全体がクエリに一致する一致のみを検索する正規表現が必要です。

たとえば、「レッドオクトーバー」という名前の映画を検索する場合、その正確なタイトル(大文字と小文字は区別されません)のみを照合し、「レッドオクトーバーを追え」のようなタイトルは照合しません。これを行う方法を私が知っているかどうかはよくわかりません。誰か知ってる?

ありがとう!


1
単純なもので機能するものに正規表現が必要なのはなぜstring.Containsですか?
2010年

1
正規表現を使用する必要がある理由は、MongoDBでの検索に使用しているためです。大文字と小文字を区別しないようにする必要があります。これは、正規表現でのみ実行できます
Micah

(オンフライで)データベースデータを小文字とユーザーの小文字の文字列に変換して検索してみませんか?
greenoldman 2010年

1
@macias私はそれがより良い選択肢であることに同意しませんが、残念ながら私の現在の状況ではそれを許可していません。
ミカ2010年

FYI、Ifは念を無視して2つの文字列を比較しようとすると、正規表現を使用して必要としない、簡単に行うことができますstring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

回答:


110

次の正規表現を試してください。

^Red October$

デフォルトでは、正規表現では大文字と小文字が区別されます。^マーク一致したテキストの開始$終了。


1
参考までに、大文字と小文字を区別しないように、正規表現オブジェクトを作成するときに、2番目のパラメーターRegexOptions.IgnoreCaseを追加します。
ToolmakerSteve

その文字列の周りに何か他のものがある場合、これは機能しません。たとえば、Streetのように「St」を検索していたが、同じ行に「Stirling」という名前などの「St」で始まる他の文字列がある場合、この正規表現は完全には一致しません。残念ながら、このシナリオに対する正規表現が正しい答えかどうかはわかりません。でも頑張っていきます。以下のTimの答えは良いですが、すべてのエンジンがこれをサポートしているわけではありません。
dyslexicanaboko

実際に$は、文字列の終わりと常に一致するとは限りません\z\ZPythonの場合と同等です)。TimPietzckerの回答をご覧ください。ただし、JavaScriptにも当てはまります。
Wiktor第Stribiżew

40

一般に、デフォルト設定では^$アンカーは正規表現が文字列全体と一致することを確認するための良い方法です。

ただし、いくつかの注意点があります。

正規表現に変更がある場合は、正規表現をキャプチャしないグループで囲んでから、^とで囲んでください$

^foo|bar$

もちろんとは異なります

^(?:foo|bar)$

また、^そして$異なる意味(の開始/終了を取ることができるラインの代わりに、開始/終了の文字列を特定のオプションが設定されている場合)。正規表現をサポートするテキストエディタでは、これが通常のデフォルトの動作です。一部の言語、特にRubyでは、この動作をオフにすることさえできません。

したがって、文字列全体の開始/終了でのみ一致することが保証されているアンカーの別のセットがあります。

\A 文字列の先頭で一致します。

\Z 文字列の最後または最後の改行の前に一致します。

\z 文字列の最後に一致します。

ただし、すべての言語がこれらのアンカー、特にJavaScriptをサポートしているわけではありません。


4
これが最も役立つ答えです
Jeremy Danyow 2015年

18

^および$修飾子を使用して、文字列の開始と終了に対して正規表現パターンが配置される場所を示します。

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail

10

これに答えるのは少し遅いかもしれませんが、他の誰かにとっては便利かもしれません。

最も簡単な方法:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}

2
私見これは受け入れられた答えよりも簡単ではありません。しかし、それは代替手段です。
ToolmakerSteve

正規表現を変更するのではなく、コード自体が意図した動作を示すため、この回答が好きです(正規表現をほとんど理解していないコードをちらっと見ている人にはわかりにくいかもしれません)。潜在的な問題は、完全一致が可能であっても、Regex.Match関数が部分一致を返すことで、文字列全体または文字列の一部に一致するように正規表現を記述できることです。
John Thoits


0

申し訳ありませんが、それは少し不明確です。

私が読んだものから、あなたは単純な文字列比較をしたいと思います。そのために正規表現は必要ありません。

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());

1
正規表現を使用する必要がある理由は、MongoDBでの検索に正規表現を使用しており、正規表現でのみ実行できる大文字と小文字を区別しないようにする必要があるためです。
ミカ2010年

-1

文字列からaを引いた文字を1回だけキャッチしたい場合は、この例のように行うことができ、myRegex.IsMatch()で確認できます。

^ [^ e] [e] {1} [^ e] $

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