如果我有这样的字符串“Hello - World - Hello World”
我想替换子字符串的第一个实例之前的字符“ - ”
例如,用“SUPERDOOPER”替换上面的内容会留下:“SUPERDOOPER - World - Hello World”
到目前为止,我得到了这个:“^[^-]* - ”
但这包括错误的“ - ”。
请问如何用正则表达式做到这一点?
使用非捕获组,它先于模式检查以验证匹配,但不将这些字符包含在匹配本身中。
(^[^-]*)(?: -)
编辑:再想一想,这似乎有点多余。这不工作吗?:
^[^-]*
获取字符串开头之间的所有非破折号字符并继续直到遇到破折号?还是您也需要排除空间?如果是这样,请选择第一个。
为什么你认为你需要对这样的字符串操作使用正则表达式?
这更简单,更有效:
str = "SUPERDOOPER" + str.Substring(str.IndexOf(" -"));
您可以尝试将正则表达式与积极的前瞻一起使用:"^[^-]*(?= - )"
。据我所知,C# 支持它。此正则表达式将完全匹配您想要的。您可以在著名的《精通正则表达式》一书中找到更多关于前瞻、后瞻和其他高级正则表达式技术的信息。
你就不能这样做吗?
Regex.Replace("World - Hello World", "^[^-]* -", "SUPERDOOPER -");
Regex.Replace(input, @"(Hello)( -.*\1)", @"SUPERDOOPER$2");
模式: ([^-]+) (- .+)
第一个表达式匹配任何一系列不包括破折号的字符。然后是一个空间。第二个表达式以破折号和空格开头,后跟一系列一个或多个“任意”字符。
替代品:“Superdooper $2”
交付 Superdooper - World - Hello World