繁体   English   中英

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

[英]Regular Expression to Replace Unwanted Letters

我用C#编写了一个小程序来捕获游戏中的文本。 我的问题是Text allso包含我尝试不使用的Collor代码。 我读到有关Regex.Replace函数的信息,我认为这将适合于此

我有“跟随字符串(行)”,我想清除一下,我用小的工具意式浓缩咖啡用正则表达式演奏了一下,但我从未真正弄清楚。

这是我要使用的字符串:

|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表示字符串的结尾。 只是用来表示第一个颜色字符串比我们得到的SPACE和|结束。 表示下一次开始。

简单的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})

由于^ start-of-line anchor| ,两者都强制匹配仅在输入字符串的开头 | 需要转义,因为不转义,它是一个特殊的“或”运算符 ,它完全改变了正则表达式的含义。

另外, |后的空格 是不希望的,而捕获组是不必要的,因为您只想删除此部分。

如果替换此所有实例

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

一无所有 (空字符串)

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

但是似乎您真的希望不仅在管道后面消除9个字符,而且还要消除9 字符。 因此,请使用{1,9}范围量词

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

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

这似乎完全可以实现您的目标。


请考虑将“ 堆栈溢出正则表达式” FAQ标记为书签,以备将来参考。

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"

我比使用Regexes更喜欢这一点,因为对我而言,它是如此清晰。

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] | [af] | [AF]){8})OR [|] r,它是所有颜色代码OR | r。

颜色代码的分解是一个以| c开头的集合,其后是正好是8个字符的集合,这些字符可以是0到9或a到f或A到F。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM