如何为“123456#”编写正则表达式以打印123456?

时间:2012-11-19 09:12:22

标签: c# regex

嗨我需要一个正则表达式将#或*替换为“”(emptyString)我尝试使用/[\\*\\#]/g但似乎没有工作。

http://ideone.com/MtjsX5

请在这需要你的帮助。

我实际上正在使用这个Grxml语法如下

SWI_meaning          = DIGITS.SWI_literal.replace( /[ ]+/g, '' );
 SWI_meaning          = SWI_meaning.replace( /[\*\#]/g, '' );

由于

4 个答案:

答案 0 :(得分:5)

您可以使用char.IsDigit仅过滤掉字符串中的数字,而不是正则表达式。请尝试以下方法。

string str = "123456#";
string newString = string.Join("",
                         str.Select(r=> char.IsDigit(r) ? r.ToString():""));

编辑:礼貌@ L.B

string newString = String.Join("",str.Where(char.IsDigit));

答案 1 :(得分:4)

string str = "123456#";
string clean = Regex.Replace(str, @"[#*]", string.Empty);

答案 2 :(得分:1)

  

有些人在面对问题时会想到,我知道,我会使用正则表达式。"现在他们有两个问题。

要跟随Jamie Zawinski的建议,你可以简单地给替换两次。

String str = "123456#*42#";
var result = str.Replace("*", "").Replace("#", "");

PS。并不是说它真的很重要但是Replace Replace似乎是最快的。 https://gist.github.com/4109899 DS。

答案 3 :(得分:0)

似乎缺少一个选项,然后你几乎完全被覆盖了。为了删除两个字符,Replace.Replace的使用是最快的,紧跟数组操作和字符串构建器。

Linq Where和string.Join的使用让一切变得有点慢,尽管它并不重要。

你会惊讶地发现Regex(至少在.NET 4.5下)没有你想象的那么慢。它比使用Linq更快。也许如果您使用编译的表达式或委托,您可能能够更快地加速Linq表达式。

当您需要从字符串中替换较大的部分或更多字符而不仅仅是两个字符时,统计信息可能会发生变化。

    static void Main(string[] args)
    {
        string str = "123456#23876587234687237*723547623547523745273#";

        Console.WriteLine("Join+Where");
        Test(s => String.Join("",s.Where(char.IsDigit)), str);

        Console.WriteLine("ArrayOperation");
        Test(s => new string(Array.FindAll(s.ToCharArray(), char.IsDigit)), str);

        Console.WriteLine("Join+Select");
        Test(s => string.Join("", s.Select(r=> char.IsDigit(r) ? r.ToString():"")), str);

        Console.WriteLine("ReplaceReplace");
        Test(s => s.Replace("*", "").Replace("#", ""), str);

        Console.WriteLine("Regex");
        Test(s => Regex.Replace(s, "[#*]", ""), str);

        Console.WriteLine("Regex");
        Regex rx = new Regex("[#*]", RegexOptions.Compiled);
        rx.Match(""); // Precompile for better results
        Test(s => rx.Replace(s, ""), str);

        Console.WriteLine("StringBuilder");
        Test(s => new StringBuilder(s).Replace("*", "").Replace("#", "").ToString(), str);
        Console.ReadLine();

    }

    public static void Test(Func<string,string> proposedSolution, string input)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Thread.Sleep(5000);

        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 0; i < 1000; i++)
        {
            string val = proposedSolution(input);
            Debug.Write(val);
        }

        sw.Stop();

        Console.WriteLine(sw.ElapsedMilliseconds);
    }

“123456#23876587234687237 * 723547623547523745273#”的输出如下(您会注意到如果正确使用正则表达式,它并不像人们让您相信的那么慢:

Join+Where
88
ArrayOperation
25
Join+Select
45
ReplaceReplace
18
Regex
39
Regex+Compiled
41
StringBuilder
19

当您需要替换除数字之外的所有内容时,这可能会变得更有趣。或者更具体地说是“#”和“*”。但最后,创建一个简单的测试,然后选择最容易理解和执行的方法可能是最好的解决方案。

要指出的一件事:并非所有提供的解决方案都完全相同。有些只保留数字,有些则特定从给定输入中删除两个字符。对于您的示例,两个选项似乎都是有效的,但了解差异非常重要。

使用LINQ删除#和*的相同选项:

        char[] Removechars = new[] { '#', '*' };

        Console.WriteLine("Join+Where");
        Test(s => String.Join("", s.Where(c => !Removechars.Contains(c))), str);

        Console.WriteLine("ArrayOperation");
        Test(s => new string(Array.FindAll(s.ToCharArray(), c => !Removechars.Contains(c))), str);

        Console.WriteLine("Except");
        Test(s => new string(s.ToCharArray().Except(Removechars).ToArray()), str);

        Console.WriteLine("Join+Select");
        Test(s => string.Join("", s.Select(c => !Removechars.Contains(c) ? c.ToString():"")), str);

这些选项都比使用IsDigit或!IsDigit慢。