在C#

时间:2018-06-05 14:41:10

标签: c# .net regex

我在这个主题上发现了几个帖子,但是在我的案例中提到的解决方案不起作用。

请考虑以下代码:

    static void Main(string[] args)
    {
        string rgs = "^[ -~]*(?:\r?\n[ -~]*)*$";

        string TestStrNoMatch = "One\tTwo\r\nThree Ö";
        string TestStrMatch = "OneTwo\r\nThree ";

        Regex rgx = new Regex(rgs);

        bool Match = rgx.IsMatch(TestStrNoMatch); // false

        Match = rgx.IsMatch(TestStrMatch); // true

        string result = Regex.Replace(TestStrNoMatch, rgs, "");

        // result is the same as TestStrNoMatch
    }

预期结果是\ t和Ö被删除,但这不会发生。结果的值与TestStrNoMatch

完全相同

澄清:我在我的例子中使用的正则表达式只允许空格和〜(英文字母,数字和一些特殊字符)之间的字符和Windows和Unix格式的新行。我想删除其他所有内容。

2 个答案:

答案 0 :(得分:1)

您的正则表达式需要匹配您要删除的字符才能使regex.replace正常工作。因为您的模式与任何内容都不匹配,所以不会替换任目前还不清楚你想要删除什么,但这是一个例子:

模式(\\t)|(Ö)匹配制表符和Ö字符,所以

    string sample = "ab\tcefÖ";
    string pattern = "(\\t)|(Ö)";
    string result = Regex.Replace(sample, pattern, "");
    System.Console.WriteLine("SAMPLE : " + sample);
    System.Console.WriteLine("RESULT : " + result);

结果

SAMPLE: ab      cefÖ
RESULT: abcef

如果您要解释所有想要删除的内容,我可以向您指出更具代表性的正则表达式模式。例如,要删除空格和〜之间的所有字符,以及标签,您可以使用[^ -~]|(\\t)

答案 1 :(得分:0)

为什么不这样做而不是使用正则表达式?我认为更好的可读性。

string text = "abcdef";
char[] invalidChars = { 'a', 'b', 'c' }; // Your invalid characters here

if (text.IndexOfAny(invalidChars) != -1)
{
    text = new String(text.Where(c => !invalidChars.Contains(c)).ToArray());
}

输出:“def”