C#中的正则表达式替换

时间:2013-04-20 05:37:40

标签: c# regex

我对使用正则表达式相当陌生,而且,根据我读过的一些教程,我无法在正确格式化Regex.Replace中获得此步骤。

以下是我正在处理的场景......当我从列表框中提取数据时,我想将其格式化为CSV格式,然后保存文件。使用“替换”选项是此方案的理想解决方案吗?

在正则表达式格式化示例之前。

FirstName LastName Salary    Position
-------------------------------------
John      Smith    $100,000.00  M

正则表达式替换后的建议格式

John Smith,100000,M

当前格式化状态输出:

John,Smith,100000,M

*注意 - 有没有办法用空白替换第一个逗号?

我的代码片段

using(var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
{
    using(var sw = new StreamWriter(fs))
    {
        foreach (string stw in listBox1.Items)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(stw);

            //Piecing the list back to the original format
            sb_trim = Regex.Replace(stw, @"[$,]", "");
            sb_trim = Regex.Replace(sb_trim, @"[.][0-9]+", "");
            sb_trim = Regex.Replace(sb_trim, @"\s", ",");
            sw.WriteLine(sb_trim);
        }
    }
}

4 个答案:

答案 0 :(得分:43)

你可以用两个替换

来做到这一点
//let stw be "John Smith $100,000.00 M"

sb_trim = Regex.Replace(stw, @"\s+\$|\s+(?=\w+$)", ",");
//sb_trim becomes "John Smith,100,000.00,M"

sb_trim = Regex.Replace(sb_trim, @"(?<=\d),(?=\d)|[.]0+(?=,)", "");
//sb_trim becomes "John Smith,100000,M"

sw.WriteLine(sb_trim);

答案 1 :(得分:16)

试试这个::

sb_trim = Regex.Replace(stw, @"(\D+)\s+\$([\d,]+)\.\d+\s+(.)",
    m => string.Format(
        "{0},{1},{2}",
        m.Groups[1].Value,
        m.Groups[2].Value.Replace(",", string.Empty),
        m.Groups[3].Value));

这至少与正则表达式一样,是一个干净利落的答案。

  • (\D+):第一个捕获组。一个或多个非数字字符。
  • \s+\$:一个或多个间距字符,然后是文字美元符号($)。
  • ([\d,]+):第二个捕获组。一个或多个数字和/或逗号。
  • \.\d+:小数点,然后至少一位数。
  • \s+:一个或多个间距字符。
  • (.):第三个捕获组。任何非破线的角色。

第二个捕获组还需要删除其逗号。你可以用另一个正则表达式做到这一点,但它对于性能来说真的是不必要和坏的。这就是为什么我们需要使用lambda表达式和字符串格式来拼凑替换。如果不是这样,我们可以使用它作为替代,代替lambda表达式:

"$1,$2,$3"

答案 2 :(得分:3)

添加以下2行

var regex = new Regex(Regex.Escape(","));
sb_trim = regex.Replace(sb_trim, " ", 1);

如果sb_trim = John,Smith,100000,M ,上述代码将返回“John Smith,100000,M”

答案 3 :(得分:0)

以下代码通过将电影字幕向前移动24秒来同步电影字幕:

using System;
using System.IO;
using System.Text.RegularExpressions;

// ...
static void Main(string[] args)
{
    string source = File.ReadAllText("Fantastic Beasts The Crimes of Grindelwald [2018] CAM.txt");

    string pattern = @"\d{2}:\d{2}:\d{2}";

    source = Regex.Replace(source, pattern, match =>
    {
        DateTime time;
        if (DateTime.TryParse(match.Value, out time))
        {
            time = time.AddSeconds(24);
            return time.TimeOfDay.ToString();
        }

        return match.Value;
    });

    File.WriteAllText("Fantastic Beasts The Crimes of Grindelwald [2018] CAM.srt", source);

    Console.Write("Press any key to quit . . . ");
    Console.ReadKey(true);
}