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

本文关键字:正则表达式 替换 不需要 | 更新日期: 2023-09-27 18:16:53

我用C#编写了一个小程序来捕获ingame文本。我的问题是,文本allso包含Collor代码,我尽量不这样做。我读过Regex.Replace函数我认为这将适合这个。

我有一个我想清除的Following String(Line(,我用了一个小工具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

好吧,我不擅长regex,更喜欢我刚开始的时候。我不希望任何人向我介绍完整的解决方案(非常欢迎你这样做(,至少对我如何解决这个问题有一点帮助。我想过滤文本。

输入代码

 |c001177ffSave Code =|r |cff00AA00A|cff00AA00G|cff00AA00Q|cffff69b4g|r |cff00AA00R|cff40e0d09|cffffff00$|cffffff00#|r |cff40e0d04|cffff69b4f|cff00AA00R

应过滤到此

Save Code = AGQg R9$# 4fR

我认为这些是十六进制颜色代码,|c标记字符串的开始,|r标记字符串的结束。我认为|r|只是用来表示第一个颜色字符串结束,而|表示下一个开始。

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

一个简单的Linq怎么样?

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

所以我认为您遇到的问题是无法逃脱|。。。以下正则表达式适用于我:

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

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

^|( [a-zA-Z0-9]{9})

由于行锚的^开头,两者都强制匹配仅在输入字符串的开头,而|需要转义,因为未转义,它是一个特殊的"或"运算符,它完全改变了正则表达式的含义。

此外,|后面的空间是不需要的,捕获组是不必要的,因为您只想消除这一部分。

如果您替换此的所有实例

'|[a-zA-z0-9]{9}

(空字符串(

您将实现大部分目标。请在此处尝试:http://regex101.com/r/rF6yB6/1

但是,您似乎真的不仅想消除管道后面的九个字符,还想消除到九个字符。因此,请使用{1,9}范围限定符:

'|[a-zA-z0-9]{1,9}

试试看:http://regex101.com/r/rF6yB6/2

这似乎完全达到了你的目标。


请考虑将"堆栈溢出正则表达式常见问题"作为书签以备将来参考。

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"

我更喜欢这个,而不是使用Regex,因为它对我来说更清晰。

var str1 = "|c001177ffSave Code =|r |cff00AA00A|cff00AA00G|cff00AA00Q|cffff69b4g|r |cff00AA00R|cff40e0d09|cffffff00$|cffffff00#|r |cff40e0d04|cffff69b4f|cff00AA00R"
var str2 = Regex.Replace(str,@"'|(r|[a-zA-Z0-9]{9})","") //"Save Code = AGQg R9$# 4fR"

除了这个答案re:转义"pipe"字符之外,您还用插入符号(^(字符启动正则表达式。这与一行的开头相匹配。

正确的正则表达式是:

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

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

([|]c([0-9]|[a-f]|[A-F]){8})|[|]r

下面是明细。。。

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

括号组成一组。因此,您正在搜索([|]c([0-9]|[a-f]|[a-f]({8}(OR[|]r,它是您的所有颜色代码OR|r。

颜色代码的分解是以|c开头的一组,后面是一组正好8个字符,可以是0到9,也可以是a到f或a到f。

我在RegexPal.com上测试过。