C# 替换字符串任一侧的字符?

C# 替换字符串任一侧的字符?,c#,regex,C#,Regex,好吧,我要直截了当地说出来,我不知道如何做到这一点,我已经尽了最大努力,但没有成功 要使左侧的字符串与右侧的结果类似,使用正则表达式,字符串如下所示 String---String==String字符串 当中间的角色与周围的两个角色不同时 String=@=String字符串=String@string-字符串 编辑,这也是可能的 String@@@String==String@String 任何朝着正确方向的努力都是值得赞赏的。不会取代你的方法吗?它可能更容易选择和替换。 通过使用regex,

好吧,我要直截了当地说出来,我不知道如何做到这一点,我已经尽了最大努力,但没有成功

要使左侧的字符串与右侧的结果类似,使用正则表达式,字符串如下所示

String---String
==
String字符串

当中间的角色与周围的两个角色不同时

String=@=String字符串
=
String@string-字符串

编辑,这也是可能的

String@@@String
==
String@String


任何朝着正确方向的努力都是值得赞赏的。

不会取代你的方法吗?它可能更容易选择和替换。 通过使用regex,您可以尝试以下代码:

        string text = "String-MyString-String";
        var pattern = "\\-";
        var match = Regex.Replace(text, pattern, "");
编辑:所以您需要删除字符串上的第一个和最后一个减号字符,还是需要替换它?如果需要删除它,可以尝试以下代码部分:

        text = text.Remove(text.IndexOf('-'), 1);
        text = text.Remove(text.LastIndexOf('-'), 1);

如果需要替换字符,可以使用stringBuilder替换所选位置上的值。

哦,我知道你为什么不能这样做。当然,如果您这样编写正则表达式模式:

-
var result = Regex.Replace(str, @"\-","");
它不起作用,要想起作用,你需要逃避它:

\-
所以它是这样工作的:

-
var result = Regex.Replace(str, @"\-","");
所以,是的,这种模式会奏效。但正如Jon Skeet所说,您可以通过更简单的方式替换它:

var result = str.Replace("-", "");
不使用正则表达式:

static string RemoveChars(string input, params char[] chars)
{
  string output = string.Empty;

  for (int i = 0; i < input.Length; i++)
    if (!chars.Contains(input[i]))
      output += input[i];

  return output;
}
结果:


经过几天的研究,我终于明白了这一点

这里的问题是正则表达式将匹配整个字符串,因此如果我想从匹配中排除字符,我可以使用正则表达式删除匹配字符串中的第一个或最后一个字符。但不幸的是,您无法捕获匹配结果中的角色

因此,当我想匹配一个角色的任何一边,另一个如下

因此,从我对RegEx的理解来看,这是不可能的。
然而,我可以使用
环顾四周
来匹配两边的每个字符,但是b/c这不是一个单一的匹配,它也有一个只匹配单个字符的不希望的结果,如下所示

代码是

var match = Regex.IsMatch(text, @"(?<=[a-zA-Z0-9])[=@\-_]|[=@\-_](?=[a-zA-Z0-9])");
结果是这样的

这就是我现在要找的。但是,这并不能解决这个问题,因为中间的字符或字符串与两边的字符不同,上面的字符将失败。

所以我提出了这个问题,并回答了我的问题。这不是一个完整的匹配,但匹配两个不同的条件以获得我需要的结果

var match =  Regex.IsMatch(subjectString, @"(?<=[a-zA-Z0-9])[@\-=_](?=[@\-=_])|(?<=[@\-=_])[@\-=_](?=[a-zA-Z0-9])");

var match=Regex.IsMatch(subjectString,@)(?为什么需要一个Regex?
text=text.Replace(“-”,”)
可以很好地处理您所说的所有内容……如果它由于其他原因不起作用,您需要将其包含在您的问题中。(如果您尝试了一些事情,但它们都不起作用,您应该展示您所尝试的内容。)@JonSkeet,如果字符串是这样的-,内部字符串是这样-,会发生什么?这会导致失败。你说“说我决定”是什么意思?决定什么?我假设你实际上想要一个接受字符串并返回字符串的方法…为什么答案是“abc-d-e”而不是“a-bcd-e”或“a-b-cde”“例如?在我看来,基本上你还没有考虑清楚你的需求是什么,我们可以提供帮助。@KyloRen如果你想删除
a-b-c-d-e
b
周围的连字符,为什么要使用正则表达式?使用
s。替换(“-b-”,“b”)
。如果你不能解释你真正需要什么,那就休息一下,小睡一会儿,吃点零食,然后带着狂热的心情回来。我们真的不喜欢猜谜游戏。你真的应该1)小睡一会儿2)重新阅读评论,3)删除帖子。
-
除非在一定范围内,否则不需要逃避
text=Regex.Replace(text,“-”,”)
工作得很好。因此,我正确地理解您希望“A-B”变成“AB”,而“A--B”变成“A-B”?@eocron,对您的最后一条注释是的,除非它在一个范围内,否则不需要在正则表达式中转义
-
Regex.Replace(text,“-”,”)
的作用完全相同。我们不知道它是否总是第一个和最后一个破折号,因为OP不会阐明各种情况。(例如,“a-b-c d-e-f”的输出可能是“ac df”或“ab-c d-ef”。您的答案将给出后者。)这不仅效率低下,而且它无法通过
字符串--String
示例。我错过了字符串--String示例。为此,您可以检查连续的相似字符。但即使这样,也会错过StringXmyStringString->StringMyStringString示例(根据屏幕截图)。