C# 替换不需要的字母的正则表达式

C# 替换不需要的字母的正则表达式,c#,regex,C#,Regex,我用C#编写了一个小程序来捕获ingame文本。 我的问题是,文本allso包含我尽量避免的Collor代码。我读过关于函数的书 我想这将是一个很好的选择 我有下面的字符串(行),我想澄清一下,我用了一个小工具espresso来玩正则表达式,但我从来没有真正弄明白 这是我将要使用的字符串: |c001177ffSave Code =|r |cff00AA00A|cff00AA00G|cff00AA00Q|cffff69b4g|r |cff00AA00R|cff40e0d09|cffffff00$

我用C#编写了一个小程序来捕获ingame文本。 我的问题是,文本allso包含我尽量避免的Collor代码。我读过关于函数的书 我想这将是一个很好的选择

我有下面的字符串(行),我想澄清一下,我用了一个小工具espresso来玩正则表达式,但我从来没有真正弄明白

这是我将要使用的字符串:

|c001177ffSave Code =|r |cff00AA00A|cff00AA00G|cff00AA00Q|cffff69b4g|r |cff00AA00R|cff40e0d09|cffffff00$|cffffff00#|r |cff40e0d04|cffff69b4f|cff00AA00R
我尝试使用
^|([a-zA-Z0-9]{9})

这给了我一些火柴
c001177ff
cff00AA00
cff00AA00
cff00AA00
cffff69b4
cff00AA00
cff40e0d0
cffffff00
cffffff00
cff40e0d0
cffff69b4
cff00AA00

我不太擅长正则表达式,很可能是我刚开始的。我不希望任何机构向我提供完整的解决方案(非常欢迎你这么做),至少对我如何解决这个问题有一点帮助。我想过滤文本

输入代码

 |c001177ffSave Code =|r |cff00AA00A|cff00AA00G|cff00AA00Q|cffff69b4g|r |cff00AA00R|cff40e0d09|cffffff00$|cffffff00#|r |cff40e0d04|cffff69b4f|cff00AA00R
应该过滤到这个

Save Code = AGQg R9$# 4fR
我认为这些是十六进制的颜色代码,| c表示字符串的开始,| r表示字符串的结束。我认为| r |只是用来表示第一个颜色字符串的结束,而|表示下一个开始

string input = "[The example input from your question]";
string output = input.Replace("|r", "");
while (output.Contains("|c"))
    output = output.Remove(output.IndexOf("|c"), 10);
// output = "Save Code = AGQg R9$# 4fR"
比起使用正则表达式,我更喜欢它,因为它对我来说更清晰


与使用正则表达式相比,我更喜欢它,因为它对我来说更为清晰。

所以我认为您遇到的问题是没有逃过
。。。以下正则表达式适用于我:

var replaced = Regex.Replace(intput, @"\|c[0-9a-zA-Z]{8}|\|r", "");
  • \|c[0-9a-zA-Z]{8}
    -匹配以
    开头的“|c”
    ,然后匹配任意8个字母或数字
  • |
    -或
  • \\r
    -匹配
    “\r”

所以我认为你遇到的问题是没有逃脱你的
。。。以下正则表达式适用于我:

var replaced = Regex.Replace(intput, @"\|c[0-9a-zA-Z]{8}|\|r", "");
  • \|c[0-9a-zA-Z]{8}
    -匹配以
    开头的“|c”
    ,然后匹配任意8个字母或数字
  • |
    -或
  • \\r
    -匹配
    “\r”

    • 简单的Linq怎么样

      var output = String.Join("", input.Split('|')
                                   .Select(s => s.Length != 10 ? ' ' : s.Last()))
                   .Trim();
      

      简单的Linq怎么样

      var output = String.Join("", input.Split('|')
                                   .Select(s => s.Length != 10 ? ' ' : s.Last()))
                   .Trim();
      

      你在正确的轨道上。你的正则表达式

      ^|( [a-zA-Z0-9]{9})
      
      这两种方法都强制匹配仅位于输入字符串的开头,因为需要转义,
      |
      ,因为未转义,它是一种特殊类型,完全改变了正则表达式的含义

      此外,
      |
      后面的空格是不需要的,并且不需要,因为您只想消除这一部分

      如果替换此的所有实例

      \|[a-zA-z0-9]{9}
      
      不带任何内容(空字符串)

      你将实现你的大部分目标。请在此处尝试:

      但似乎你真的不想只删除管道后面的九个字符,而是要删除九个字符。因此,请使用以下选项:

      试试看:

      这似乎正好实现了你的目标



      请考虑书签以备将来参考。

      < P >你走对了。你的正则表达式

      ^|( [a-zA-Z0-9]{9})
      
      这两种方法都强制匹配仅位于输入字符串的开头,因为需要转义,
      |
      ,因为未转义,它是一种特殊类型,完全改变了正则表达式的含义

      此外,
      |
      后面的空格是不需要的,并且不需要,因为您只想消除这一部分

      如果替换此的所有实例

      \|[a-zA-z0-9]{9}
      
      不带任何内容(空字符串)

      你将实现你的大部分目标。请在此处尝试:

      但似乎你真的不想只删除管道后面的九个字符,而是要删除九个字符。因此,请使用以下选项:

      试试看:

      这似乎正好实现了你的目标


      请考虑书签,以供将来参考。

      < P>此外,您要用插入符号(<代码> ^ < /代码>)字符启动正则表达式。这与行的开头相匹配

      正确的正则表达式应该是:

      \|c[0-9a-zA-Z]{8}
      
      除此之外,您还使用插入符号(
      ^
      )字符启动正则表达式。这与行的开头相匹配

      正确的正则表达式应该是:

      \|c[0-9a-zA-Z]{8}
      

      此正则表达式应与要删除的所有字符匹配:

      ([|]c([0-9]|[a-f]|[A-F]){8})|[|]r
      
      这里是故障

      垂直管道是一个或标记,因此要搜索它,请将其放在方括号中[和]

      括号构成一个集合。因此,您正在搜索([|]c([0-9][a-f][a-f]){8})或[|]r,这是您所有的颜色代码或| r

      颜色代码的细分是以| c开头的集合,后面紧跟着8个字符的集合,这些字符可以是0到9或a到f或a到f


      我在RegexPal.com上对其进行了测试。

      此正则表达式应与要删除的所有字符匹配:

      ([|]c([0-9]|[a-f]|[A-F]){8})|[|]r
      
      这里是故障

      垂直管道是一个或标记,因此要搜索它,请将其放在方括号中[和]

      括号构成一个集合。因此,您正在搜索([|]c([0-9][a-f][a-f]){8})或[|]r,这是您所有的颜色代码或| r

      颜色代码的细分是以| c开头的集合,后面紧跟着8个字符的集合,这些字符可以是0到9或a到f或a到f


      我在RegexPal.com上测试了它。

      是否
      string.Split(“|”)
      +几行代码不起作用?您必须使用正则表达式吗?
      string.Split(“|”)
      +几行代码不起作用吗?你必须使用正则表达式吗?这是防御问题之一谢谢你我记住我必须逃跑|如果我寻找它这是防御问题之一谢谢你我记住我必须逃跑|如果我寻找它