2

C# 正規表現を a の後に行末または空白が続くものIsMatchと一致させる方法がわかりません。<keyword>

現在、これはスペースで機能しますが、または[\s]+keyword[\s]+では機能しません。keyword<end of string><start of string>keyword

を試してみ[\s^]+keyword[\s$]+ましたが、これによりスペースとの一致に失敗し、文字列の末尾または先頭で機能しません。

私が試したコードは次のとおりです。

string pattern = string.Format("[\\s^]+{0}[\\s$]+",keyword);
if(Regex.IsMatch(Text, pattern, RegexOptions.IgnoreCase))
4

4 に答える 4

9

問題は、^および$内部の文字クラスがアンカーとしてではなく、リテラル文字として扱われることです。文字クラスの代わりに単純に代替を使用できます。

string pattern = string.Format(@"(?:\s|^){0}(?:\s|$)",keyword);

+スペースが 1 つあるかどうかを確認したいだけなので、は必要ないことに注意してください。もっと多くても構いません。これは良い習慣であり、ここで必要のないキャプチャ?:を抑制します。そして、文字列をそのままの文字列にするため、バックスラッシュを二重にエスケープする必要はありません。@

別の方法がありますが、これは少しすっきりしています。lookaroundsを使用して、キーワードの左右にスペース以外の文字がないことを確認できます (はい、二重否定、考えてみてください)。この仮定は、スペース文字がある場合、または文字列の一方の端がある場合に有効です。

string pattern = string.Format(@"(?<!\S){0}(?!\S)",keyword);

これはまったく同じことを行いますが、わずかに効率的である可能性があります (ただし、それが重要な場合でも、確実にプロファイルする必要があります)。

(正の) ルックアラウンドで最初のパターン (非反転ロジック) を使用することもできます。

string pattern = string.Format(@"(?<=\s|^){0}(?=\s|$)",keyword);

ただし、文字列内で複数の一致を見つけたい場合を除き、これは最初のパターンと実際には違いはありません。

ところで、keyword正規表現のメタ文字 ( 、 など) が含まれている可能性が|ある場合は$+最初に次を使用してエスケープしてください。Regex.Escape

于 2013-04-25T11:25:04.267 に答える
1

この正規表現で実際に何を達成しようとしているのか正確にはわかりませんが、次のコードは、両側に空白がある場合、文字列 'keyword' と一致します。

string resultString = null;
try {
    Regex regexObj = new Regex(@"\b(keyword)\b");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

一般的に次のように説明できます: \b は単語の境界の最初と最後の位置を主張します。この場合、関心のある単語はキーワードであると想定しました。

また、あなたの質問の解釈から、キーワードに続く改行までの一連の文字全体を一致させることに興味があるかもしれないと思いました. その場合、次の正規表現コードはその一致を返します。

string resultString = null;
try {
    Regex regexObj = new Regex(@"\bkeyword\b(\w*\s*)$");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

この正規表現は、両側の \b の理由である最初と最後の単語の境界を見つけるものとして解釈できます。この (\w*\s*) $ の読み取りは、すべての単語 \w文字とスペース文字 \s* が出現する回数だけ一致し、位置を行末 $ に移動します。

この次のコードは、キーワードを含むデータ行全体を読み取ります。キーワードを含まないデータ行は一致しません。

string resultString = null;
try {
    Regex regexObj = new Regex("^.*keyword.*$");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

説明: ^ は文字列の先頭に位置し、.* は改行文字ではない任意の文字に一致し、キーワードが含まれてから .* が続くため、残りの改行以外の文字が含まれ、$ はこの例では行全体になる文字列の末尾に位置します。

今回ではないにしても、将来的には上記が役立つことを願っています。私は常に同じ結果を達成するための別の方法を見つけようとしていますので、建設的な批判があれば投稿してください。

よろしくお願いします、スティーブ

于 2013-04-25T13:00:53.033 に答える
0

これを試して:

string pattern = string.Format("^\\s*{0}\\s*$",keyword);
于 2013-04-25T11:12:27.077 に答える