Регулярное выражение заменяется на С#
Я новичок в использовании регулярных выражений, и, основываясь на нескольких учебниках, которые я прочитал, я не могу правильно выполнить этот шаг в своем 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);
}
}
}
Ответы
Ответ 1
Вы можете сделать это с помощью двух элементов замены
//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);
Ответ 2
Попробуйте следующее:
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+
: один или несколько символов пробела.
-
(.)
: Третья группа захвата. Любой символ, отличный от строки.
Вторая группа захвата дополнительно должна иметь свою запятую. Вы можете сделать это с другим регулярным выражением, но это действительно не нужно и плохо для производительности. Вот почему нам нужно использовать выражение лямбда и строковый формат, чтобы объединить замену. Если бы не это, мы могли бы просто использовать это как замену вместо выражения лямбда:
"$1,$2,$3"
Ответ 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"