C#Regex替换所有字母,除了:abc

时间:2017-06-06 17:33:24

标签: .net regex string visual-studio c#-4.0

我在C#中尝试过几种组合,但没有运气

我想用空字符串替换字符串中的任何字母,除非字符串包含:abc作为最后4个字符?

Test123将成为123
Testabc123将成为123 Test:abc123将成为123 Test123:abc将成为123:abc Testabc123:abc将成为123:abc 在上面的例子中,字母表被替换为空字符串,除了其中:abc是最后4个字符,然后是数字:abc没有被空字符串替换

你能建议适当的正则表达式吗?

2 个答案:

答案 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();
    }