我在C#中尝试过几种组合,但没有运气
我想用空字符串替换字符串中的任何字母,除非字符串包含:abc作为最后4个字符?
Test123
将成为123
Testabc123
将成为123
Test:abc123
将成为123
Test123:abc
将成为123:abc
Testabc123:abc
将成为123:abc
在上面的例子中,字母表被替换为空字符串,除了其中:abc是最后4个字符,然后是数字:abc没有被空字符串替换
你能建议适当的正则表达式吗?
答案 0 :(得分:0)
如果使用空字符串替换,则正则表达式/^(?:(?!:abc$)\D)+/gm
几乎可以正常工作。正如您在Regex101上看到的here一样,它将匹配除数字和字符串末尾的:abc
之外的字符串的所有部分,但由于某种原因,一旦找到数字就会停止搜索。因此123Test
不受影响,Test123abc
将成为123abc
。
编辑:删除插入符号(行首)修复了它,但它还包含:abc
,因此需要它。
答案 1 :(得分:0)
你的任务还不是很清楚。字符串中可以有多少个数字组?有些数字总是先于:abc
吗?字符串是代表单行还是您希望它是多行并在每行中进行替换?
如果您只在一个字符串上使用它,请尝试
Regex.Replace(s, @"[^\d]+(\d*:abc$)|[^\d]+", "$1")
这一点背后的想法很简单:IF非数字部分以(可选)某些数字结束,而:abc
AND位于行的末尾(此类子字符串将与模式的第一部分匹配)在|
之前,然后保留它们($1
); ELSE(子字符串与模式的最后部分匹配)不会从此匹配中留下任何内容。
P.S。一般情况下,定期表达不是很好的负面模式"有时候卷起一些代码会更容易。或者Jamie Zawinski famously quoted:
有些人在面对问题时会想到 “我知道,我会使用正则表达式。” 现在他们有两个问题。
那有多难?
static string ReplaceAlphaExceptAbc(string src)
{
const string preserveEndPattern = ":abc";
var res = new StringBuilder(src.Length);
for (int i = 0; i < src.Length; i++)
{
var ch = src[i];
if (Char.IsDigit(ch))
res.Append(ch);
}
if (src.EndsWith(preserveEndPattern))
res.Append(preserveEndPattern);
return res.ToString();
}