c# regex.replace необходимо заменить 3 или более пробелов - PullRequest
1 голос
/ 25 февраля 2020

Мой пример текстового файла

92721662,5819.53,2019 - 10 - 10,04332977,5938.30, .00,118.77 -

92721664,5510.56,2019 - 10 - 10, 04332978,5623.02, .00,112.46 -

92730321,22805.90,2019 - 10 - 15,04354360,23350.20, .00,544.30 -

Последнее использованное мной регулярное выражение:

var requestbody3 = Regex.Replace(requestbody2, @" { 3 ,}[\r\n]", "");

Где requestbody2 - результат File.ReadAllText() из файла "testinput.txt"

Цель состоит в том, чтобы удалить только пустые строки, содержащие 3 или более пробелов, заканчивающиеся на \r\n, оставляя отдельные строки без пропусков между ними.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Вы можете полностью исключить Regex, что я настоятельно рекомендую .

Вместо чтения вашего файла в виде гигантской строки, получите строки, используя встроенный метод: File.ReadLines() , Затем, чтобы удалить пустые строки, вы просто используете LINQ.

Так что все вместе ваш код должен быть просто:

IEnumerable<string> lines = File.ReadLines("testinput.txt").Where(!string.IsNullOrWhiteSpace);
1 голос
/ 25 февраля 2020

Суть вашей проблемы в том, что регулярное выражение содержит посторонние пробелы и не ведет себя как квантификатор «три или более». Просто не ставьте пробелы в фигурных скобках:

//three or more spaces followed by windows or unix newline
" {3,}\r?\n"

Также учтите:

  • используйте \s вместо , чтобы соответствовать пробел
  • не ставьте [\r\n], потому что это означает "один из CR или LF", поэтому, если ваш файл имеет CRLF, он будет соответствовать CR и удалять его, но не LF, и ваш файл все равно будет иметь новые строки но будьте испорчены / смешанные окончания строк. Правильное регулярное выражение будет соответствовать 0 или 1 CR, за которым следует 1 LF
  • за комментарий Плутона, вы можете начать свое регулярное выражение с каретки, чтобы предотвратить совпадение строк, содержащих некоторый текст, а затем заканчиваться 3 или более пробелами. : ^\s{3,}\r?\n - обратите внимание, что вам также нужно включить многострочное регулярное выражение, чтобы механизм регулярных выражений обрабатывал каждую строку текста как отдельный вход - сейчас он обрабатывает весь ввод как одну строку, так что ^ only применяется к началу файла, а не к началу каждой строки
  • , в качестве альтернативы вы можете использовать положительный взгляд, чтобы убедиться, что сопоставляются только последовательности пробелов, которым предшествует символ новой строки. Предыдущий символ новой строки не является частью матча, поэтому он не заменяется: (?<=\n)\s{3,}\r?\n. Недостатком этого является то, что он не может совпадать с самой первой строкой файла, поэтому нам нужно еще одно расширение, например, «соответствовать началу ввода или новой строке, за которыми следуют 3+ пробела, а затем CR / CRLF» это: (^|(?<=\n))\s{3,}\r?\n

Избыток, но приятное учебное путешествие. Возможно, рассмотрите возможность использования одного из предложенных маршрутов, в котором не используется регулярное выражение:)

...