4

Regexクラスを使用して、c#プログラムに2つのOracleワイルドカード「%」と「_」を実装しようとしています。問題は、ワイルドカード「_」を使用する場合です。これは、1文字のみを受け入れる必要があるためですが、少なくとも1文字を使用するたびにtrueが返されます。手伝ってくれませんか?

これが私のコードです:

string filter, string1;

string wildcard1 = "[" + "\\d | " + "\\n | " + "\\s |" + "\\w]+";
string wildcard2 = "[" + "\\d | " + "\\n |" + "\\s | " + "\\w]{1}";

filter = Regex.Replace(filter, "%", wildcard1);
filter = Regex.Replace(filter, "_", wildcard2);

Regex regex1 = new Regex(filter, RegexOptions.IgnoreCase);

MatchCollection a = regex1.Matches(string1);

if (regex1.IsMatch(string1))
{
    return true;
}
4

2 に答える 2

5

次の2つの変換を行う必要があります。

  • %to .*、つまり「任意の文字、任意の回数」
  • _.これは、「任意の文字(特に指定しない場合はデフォルトで1回)」を意味します。

また、文字列内の一部ではなく、文字列全体を強制的に一致させるために^、最初と最後に追加する必要があります。$

そして最後に、これは非常に重要です。元の文字列をエスケープする必要があります。そうしないと、特殊文字は正規表現によって処理されます。つまり、元の文字列のドット.は、正規表現では「任意の文字として」解釈されます。

たとえば、次のSQLLIKE文字列がある場合:

  Hello, %, is your inital _?

次のように変換する必要があります。

  ^Hello, .*, is your inital .\?$

(これは、「こんにちは、ジョン、あなたの最初のJですか?」のような文字列に一致します)

まず、それをエスケープする必要があります。これにより、?およびその他の特殊文字はバックスラッシュでエスケープされます\

次に、文字列の開始文字と終了文字(および)を置き換え%て追加します。_^$

オプションを使用して正規表現を作成できることにも注意してください。このオプションの1つでは、大文字と小文字を区別するかどうかを指定できます。これは、Oracleの動作を模倣するためにも必要です。

最後に、Matchの代わりにIsMatch(string)メソッドを使用します。

于 2012-05-07T09:28:10.397 に答える
0

このような正規表現を使用すると、サブストリングが一致する場合に一致するものが得られます。したがって、要求して入力文字列がである場合、部分文字列が一致するため、abc_入力文字列も一致します。これを避けるために、フィルターをとで包みます。abcdeabcd^$

それに加えて、正規表現を作成するときに、次のように最初の交換を行います。

filter = Regex.Replace(filter, "%", wildcard1);
filter = Regex.Replace(filter, "_", wildcard2);

置き換える文字が正規表現の特殊文字でないことを確認しない限り、は問題を求めています。これには通常の文字列置換を使用してください。

regex.IsMatchさらに、の代わりに使用できますMatches

于 2012-05-07T08:51:29.773 に答える