替换不需要的字母的正则表达式
本文关键字:正则表达式 替换 不需要 | 更新日期: 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上测试过。