「Hello - World - Hello World」のような文字列がある場合
部分文字列「 - 」の最初のインスタンスの前にある文字を置き換えたい
たとえば、上記を「SUPERDOOPER」に置き換えると、「SUPERDOOPER - World - Hello World」が残ります。
これまでのところ、「^[^-]* -」
しかし、これには間違っている " - " が含まれています。
正規表現でこれを行う方法を教えてください。
非キャプチャー グループを使用します。これは、パターンの先を調べて一致を検証しますが、それらの文字を一致自体には含めません。
(^[^-]*)(?: -)
編集:もう一度考えてみると、それは少し冗長に思えます。これは機能しませんか?:
^[^-]*
文字列の先頭からダッシュに到達するまでの間のダッシュ以外のすべての文字を取得しますか? それとも、スペースも除外する必要がありますか? その場合は、最初のものを使用してください。
このような文字列操作に正規表現を使用する必要があるのはなぜだと思いますか?
これはよりシンプルで効率的です。
str = "SUPERDOOPER" + str.Substring(str.IndexOf(" -"));
これしかできなかったの?
Regex.Replace("World - Hello World", "^[^-]* -", "SUPERDOOPER -");
Regex.Replace(input, @"(Hello)( -.*\1)", @"SUPERDOOPER$2");
パターン: ([^-]+) (- .+)
最初の式は、ダッシュを含まない一連の文字に一致します。それからスペースがあります。2 番目の式はダッシュとスペースで始まり、その後に一連の 1 つ以上の「任意の」文字が続きます。
代替品: 「スーパードゥーパー $2」
Superdooper - World - Hello World を配信
正の先読みで正規表現を使用してみることができます: "^[^-]*(?= - )"
. 私が知る限り、C# はそれをサポートしています。この正規表現は、あなたが望むものと正確に一致します。先読み、後読み、およびその他の高度な正規表現手法については、有名な本「Mastering Regular Expressions」で詳しく知ることができます。