Исключение дубликатов из строки в результатах - PullRequest
2 голосов
/ 15 февраля 2020

Может кто-нибудь помочь мне изменить это регулярное выражение, чтобы оно также не добавляло дубликаты

Текущее регулярное выражение :

[\""].+?[\""]|[^ ]+

Пример строки :

".doc" "test.xls", ".doc","me.pdf", "test file.doc"

Ожидаемые результаты :

".doc"
"test.xls"
"me.pdf"

Но не

".doc"
"test.xls"
".doc"
"me.pdf"

Примечание :

  1. Имена файлов могут содержать пробелы, например, "test file.do c"
  2. элементы могут быть разделены пробелом или запятой или обоими
  3. строки могут иметь кавычки или НЕ иметь кавычки, например .do c ".do c"

1 Ответ

0 голосов
/ 08 марта 2020

В C# вы можете использовать простое регулярное выражение для извлечения всех допустимых совпадений и использовать .Distinct() для сохранения только уникальных значений.

Регулярное выражение простое:

"(?<ext>[^"]+)"|(?<ext>[^\s,]+)

Смотрите regex demo , вам нужны только значения группы "ext".

Подробности

  • "(?<ext>[^"]+)" - ", (группа "ext") любые 1+ символов, кроме ", а затем "
  • | - или
  • (?<ext>[^\s,]+) - (группа "ext") 1+ символов кроме пробелов и запятых

Фрагмент C#, код :

var text = "\".doc\" \"test.xls\", \".doc\",\"me.pdf\", \"test file.doc\".doc \".doc\"";
Console.WriteLine(text); // => ".doc" "test.xls", ".doc","me.pdf", "test file.doc".doc ".doc"
var pattern = "\"(?<ext>[^\"]+)\"|(?<ext>[^\\s,]+)";
var results = Regex.Matches(text, pattern)
        .Cast<Match>()
        .Select(x => x.Groups["ext"].Value)
        .Distinct();
Console.WriteLine(string.Join("\n", results));

Вывод:

.doc
test.xls
me.pdf
test file.doc
...