regex C#中的正则表达式替换

t3irkdon  于 2023-01-21  发布在  C#
关注(0)|答案(5)|浏览(185)

我对使用正则表达式还是个新手,根据我读过的一些教程,我无法在我的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);
        }
    }
}
wj8zmpe1

wj8zmpe11#

你可以用两个替换来完成

//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);
o3imoua4

o3imoua42#

试试这个:

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"
2nbm6dog

2nbm6dog3#

添加以下2行

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

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

e37o9pze

e37o9pze4#

这必须完成工作:

var result=Regex.Replace("John      Smith    $100,000.00  M", @"^(\w+)\s+(\w+)\s+\$([\d,\.]+)\s+(\w+)$","$1,$2,$3,$4");

//result: "John,Smith,100,000.00,M"
tct7dpnv

tct7dpnv5#

为了简单起见,您只需要currency中的一个数字。

Regex.Replace(yourcurrency, "[^0-9]","")

相关问题