Регулярное выражение заменить (C #) - PullRequest
2 голосов
/ 12 июня 2019

Как сделать Regex.Заменить на следующие тексты:

1) "Name's",     "Sex", "Age", "Height_(in)", "Weight (lbs)"
2) " LatD", "LatM ", 'LatS', "NS", "LonD", "LonM", "LonS", "EW", "City", "State"

Результат:

1) Name's, Sex, Age, Height (in), Weight (lbs)
2) LatD, LatM, LatS, NS, LonD, LonM, LonS, EW, City, State

Пробелы между скобками могут быть любого размера (Пример 1). В скобках также может быть неправильных пробелов (пример 2). Также вместо пробелов можно использовать знак "_" (Пример 1). И вместо двойных кавычек можно использовать одинарные кавычки (пример 2).

В результате слова должны быть разделены запятой и пробелом.

Фрагмент моего кода

StreamReader fileReader = new StreamReader(...);
var fileRow = fileReader.ReadLine();
fileRow = Regex.Replace(fileRow, "_", " ");
fileRow = Regex.Replace(fileRow, "\"", "");
var fileDataField = fileRow.Split(',');

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Я не очень хорошо знаю синтаксис C #, но это регулярное выражение выполняет свою работу:

  • Найти: (?:_|^["']\h*|\h*["']$|\h*["']\h*,\h*["']\h*)
  • Заменить: A space

Пояснение:

(?:                         # non capture group
    _                       # undersscore
  |                         # OR
    ^["']\h*                # beginning of line, quote or apostrophe, 0 or more horizontal spaces
  |                         # OR
    \h*["']$                # 0 or more horizontal spaces, quote or apostrophe, end of line
  |                         # OR
    \h*["']\h*              # 0 or more horizontal spaces, quote or apostrophe, 0 or more horizontal spaces
    ,                       #
    \h*["']\h*              # 0 or more horizontal spaces, quote or apostrophe, 0 or more horizontal spaces
)                           # end group

Демо

1 голос
/ 12 июня 2019

Как насчет простого способа манипуляции с прямыми струнами?

using System;
using System.Linq;
static void Main(string[] args)
{
    string dirty1 = "\"Name's\",     \"Sex\", \"Age\", \"Height_(in)\", \"Weight (lbs)\"";
    string dirty2 = "\" LatD\", \"LatM \", 'LatS', \"NS\", \"LonD\", \"LonM\", \"LonS\", \"EW\", \"City\", \"State\"";
    Console.WriteLine(Clean(dirty1));
    Console.WriteLine(Clean(dirty2));

    Console.ReadKey();
}

private static string Clean(string dirty)
{
    return dirty.Split(',').Select(item => item.Trim(' ', '"', '\'')).Aggregate((a, b) => string.Join(", ", a, b));
}

private static string CleanNoLinQ(string dirty)
{
    string[] items = dirty.Split(',');
    for(int i = 0; i < items.Length; i++)
    {
        items[i] = items[i].Trim(' ', '"', '\'');
    }
    return String.Join(", ", items);
}

Вы можете даже заменить LinQ на foreach, а затем на string.Join ().

Легче понять - легче поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...