3

如果我有这样的字符串“Hello - World - Hello World”

我想替换子字符串的第一个实例之前的字符“ - ”

例如,用“SUPERDOOPER”替换上面的内容会留下:“SUPERDOOPER - World - Hello World”

到目前为止,我得到了这个:“^[^-]* - ”

但这包括错误的“ - ”。

请问如何用正则表达式做到这一点?

4

6 回答 6

3

使用非捕获组,它先于模式检查以验证匹配,但不将这些字符包含在匹配本身中。

(^[^-]*)(?: -)

编辑:再想一想,这似乎有点多余。这不工作吗?:

^[^-]*

获取字符串开头之间的所有非破折号字符并继续直到遇到破折号?还是您也需要排除空间?如果是这样,请选择第一个。

于 2009-03-29T23:13:10.430 回答
1

为什么你认为你需要对这样的字符串操作使用正则表达式?

这更简单,更有效:

str = "SUPERDOOPER" + str.Substring(str.IndexOf(" -"));
于 2009-03-30T00:45:21.597 回答
0

您可以尝试将正则表达式与积极的前瞻一起使用:"^[^-]*(?= - )"。据我所知,C# 支持它。此正则表达式将完全匹配您想要的。您可以在著名的《精通正则表达式》一书中找到更多关于前瞻、后瞻和其他高级正则表达式技术的信息。

于 2009-03-30T00:17:23.147 回答
0

你就不能这样做吗?

Regex.Replace("World - Hello World", "^[^-]* -", "SUPERDOOPER -");

于 2009-03-29T23:13:22.940 回答
0
Regex.Replace(input, @"(Hello)( -.*\1)", @"SUPERDOOPER$2");
于 2009-03-29T23:14:19.740 回答
0

模式: ([^-]+) (- .+)

第一个表达式匹配任何一系列不包括破折号的字符。然后是一个空间。第二个表达式以破折号和空格开头,后跟一系列一个或多个“任意”字符。

替代品:“Superdooper $2”

交付 Superdooper - World - Hello World

于 2009-03-29T23:15:05.090 回答