Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用正则表达式用字符串替换精确短语_C#_Regex_String - Fatal编程技术网

C# 如何使用正则表达式用字符串替换精确短语

C# 如何使用正则表达式用字符串替换精确短语,c#,regex,string,C#,Regex,String,我有下面的字符串 *keyName:品牌SLES重新定位:(不可重新定位)*keyOpenEnd 我想用{“和“:分别替换*key和*keyopend,所以我有一个结果字符串 {“名称:品牌SLES重新定位:(不可重新定位)”: 所以我有 output = Regex.Replace(output, @"\b"+"key"+@"\b", "{\""); output = Regex.Replace(output, @"\b\*keyOpenEnd\b", "\":"); 我尝试过各种不同的组合

我有下面的字符串

*keyName:品牌SLES重新定位:(不可重新定位)*keyOpenEnd

我想用{“和“:分别替换*key和*keyopend,所以我有一个结果字符串

{“名称:品牌SLES重新定位:(不可重新定位)”:

所以我有

output = Regex.Replace(output, @"\b"+"key"+@"\b", "{\"");
output = Regex.Replace(output, @"\b\*keyOpenEnd\b", "\":");
我尝试过各种不同的组合,但都不起作用

更新:这个问题似乎有点混乱。
为了澄清,我需要替换准确的短语,否则它将替换keyopend中的“Key”以及不好的Key。我需要准确的短语替换。

尝试将
^\*Key
替换为{和
\*keyopend$
替换为}

已编辑,如果*是通配符,则执行以下操作


{“$1”
替换
键(.*)keyopend
为什么不直接使用
字符串。替换
并确保先替换更具体的值

output = output.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
编辑

下面是比较正则表达式时间和
字符串的测试代码。替换
和我的结果

string s = "*keyName:branding-SLES Relocations:(not relocatable)*keyOpenEnd";
string desired = "{\"Name:branding-SLES Relocations:(not relocatable)\":";

Stopwatch watch = new Stopwatch();

watch.Start();
for (int i = 0; i < 100000; i++)
{
    var n = Regex.Replace(s, @"\*keyOpenEnd", "\":");
    n = Regex.Replace(n, @"\*key", "{\"");
    Assert.AreEqual(desired, n);
}
watch.Stop();

Console.WriteLine("RegEx Total: {0}", watch.Elapsed);

watch.Reset();
watch.Start();
for (int i = 0; i < 100000; i++)
{
    var n = s.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
    Assert.AreEqual(desired, n);
}
watch.Stop();

Console.WriteLine("String Replace Total: {0}", watch.Elapsed);
附加编辑

如果使用一个正则表达式并预先编译以供使用,
string.Replace
速度更快

string s = "*keyName:branding-SLES Relocations:(not relocatable)*keyOpenEnd";
string desired = "{\"Name:branding-SLES Relocations:(not relocatable)\":";
Regex r = new Regex(@"\*key(.*)\*keyOpenEnd", RegexOptions.Compiled);

Stopwatch watch = new Stopwatch();

watch.Start();
for (int i = 0; i < 100000; i++)
{
    var n = r.Replace(s, "{\"$1\":");
    Assert.AreEqual(desired, n);
}
watch.Stop();

Console.WriteLine("RegEx Total: {0}", watch.Elapsed);

watch.Reset();
watch.Start();
for (int i = 0; i < 100000; i++)
{
    var n = s.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
    Assert.AreEqual(desired, n);
}
watch.Stop();

Console.WriteLine("String Replace Total: {0}", watch.Elapsed);

这仍然会导致*key和*keyopend$no中的*key被替换?请参阅更新的问题、添加的说明和所需的示例string@Fearghal那么*实际上是指某个字符串而不是“*”字符?不确定这是什么意思。你能解释一下吗?请参阅更新的问题、添加的说明和所需的示例StringTrought,是吗在更通用的搜索词之前查找特定的搜索词?这似乎比正则表达式慢,但确实有效。但这很尴尬,因为它确实取决于替换词的顺序,我有几个替换词。@Fearghal如果要替换的词多于这两个,您可能想进一步回答您的问题。您是如何确定this比两个正则表达式调用慢,我希望这会更快,但还没有实际测试。@Fearghal我刚刚对正则表达式和字符串替换进行了测试,字符串替换在我的机器上快了4倍。如果需要,我可以将我的测试代码放入答案中。在 *key
在开头或结尾(当它是
*keyopend
的开头时)。因此,我认为除了替换较长的(不太含糊)外,您别无选择但是,在这个特殊的例子中,我认为你的第二个
\b
是个问题-在你的第一个正则表达式中,
\bkey\b
不会匹配
keyName
。当我知道eprase是“*key”和*keyopennd”时,为什么需要一个分隔符?我能不能说用X和keyopennd替换*keyh Y在某种程度上不会将keyOpenEnd中的键替换为X??好吧,你可以这样做,如果你总是把它们放在那个序列中,那么你就可以把它变成一个正则表达式。是这样吗?你还不是很清楚。是的,总是放在那个序列中,如果这样有帮助的话。@Fearghal我已经更新了我的答案,使它包含一个编译的正则表达式n可以使用,但正如您所看到的
string.Replace
更快。
string s = "*keyName:branding-SLES Relocations:(not relocatable)*keyOpenEnd";
string desired = "{\"Name:branding-SLES Relocations:(not relocatable)\":";
Regex r = new Regex(@"\*key(.*)\*keyOpenEnd", RegexOptions.Compiled);

Stopwatch watch = new Stopwatch();

watch.Start();
for (int i = 0; i < 100000; i++)
{
    var n = r.Replace(s, "{\"$1\":");
    Assert.AreEqual(desired, n);
}
watch.Stop();

Console.WriteLine("RegEx Total: {0}", watch.Elapsed);

watch.Reset();
watch.Start();
for (int i = 0; i < 100000; i++)
{
    var n = s.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
    Assert.AreEqual(desired, n);
}
watch.Stop();

Console.WriteLine("String Replace Total: {0}", watch.Elapsed);
RegEx Total: 00:00:00.0960996
String Replace Total: 00:00:00.0393491