我对使用正则表达式相当新,而且,根据我读过的一些教程,我无法在我的Regex.Replace格式化中正确地执行此步骤.
这是我正在处理的场景......当我从列表框中提取数据时,我想将其格式化为CSV格式,然后保存文件.使用"替换"选项是此方案的理想解决方案吗?
在正则表达式格式化示例之前.
FirstName LastName Salary Position
-------------------------------------
John Smith $100,000.00 M
Run Code Online (Sandbox Code Playgroud)
正则表达式替换后的建议格式
John Smith,100000,M
Run Code Online (Sandbox Code Playgroud)
当前格式化状态输出:
John,Smith,100000,M
Run Code Online (Sandbox Code Playgroud)
*注意 - 有没有办法用空格替换第一个逗号?
我的代码片段
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ani*_*dha 51
你可以用两个替换来做到这一点
//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);
Run Code Online (Sandbox Code Playgroud)
Zen*_*xer 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));
Run Code Online (Sandbox Code Playgroud)
这至少与正则表达式一样,是一个干净利落的答案.
(\D+):第一个捕获组.一个或多个非数字字符.\s+\$:一个或多个间距字符,然后是文字美元符号($).([\d,]+):第二个捕获组.一个或多个数字和/或逗号.\.\d+:小数点,然后至少一位数.\s+:一个或多个间距字符.(.):第三个捕获组.任何非破线字符.第二个捕获组还需要剥离其逗号.你可以用另一个正则表达式做到这一点,但它对于性能来说真的是不必要和坏的.这就是为什么我们需要使用lambda表达式和字符串格式来拼凑替换.如果不是为了那个,我们可以使用它作为替换,代替lambda表达式:
"$1,$2,$3"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
102293 次 |
| 最近记录: |