C # надежный способ сопоставления с образцом? - PullRequest
0 голосов
/ 26 января 2010

В данный момент я пытаюсь сопоставить шаблоны, такие как

text text date1 date2

Так что у меня есть регулярные выражения, которые делают именно это. Однако проблема, например, заключается в том, что, если пользователи вводят данные, скажем, больше, чем 1 пробел, или если они помещают часть текста в новую строку и т. Д., Шаблон не выбирается, потому что он не точно соответствует набор шаблонов.

Есть ли более надежный способ сопоставления с образцом? Цель состоит в том, чтобы сделать его очень простым для пользователя, но сделать его легко сопоставимым с моей стороны. Я собирался убрать все пробелы / переводы строк и т. Д., А затем попытаться сопоставить шаблон без пробелов, т.е. texttextdate1date2.

Кто-нибудь есть лучшие решения?

Обновление

Вот небольшой пример схемы, которой мне нужно соответствовать:

FIND me@test.com 01/01/2010 to 10/01/2010

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

FIND [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4} [0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4} to [0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}

Это нормально работает в 90% случаев, однако, если пользователи отправляют эту информацию по электронной почте, она может иметь все различные виды форматирования и HTML, который меня не интересует. Я использую комбинацию HtmlAgilityPack и HTML-тег, удаляющий регулярное выражение для удаления всего HTML-кода из электронной почты, но даже при этом я не могу найти совпадения в некоторых случаях.

Я полагаю, что это может быть более сложный вопрос, чем сопоставление с образцом, но я думаю, что, возможно, есть лучший способ сделать это ...

Ответы [ 6 ]

2 голосов
/ 26 января 2010

Пример сопоставления нескольких групп в тексте с несколькими пробелами и / или символами новой строки.

var txt = "text text   date1\ndate2";
var matches = Regex.Match(txt, @"([a-z]+)\s+([a-z]+)\s+([a-z0-9]+)\s+([a-z0-9]+)", RegexOptions.Singleline);

совпадений. Группы [n]. Значение с n от 1 до 4 будет содержать ваши совпадения.

2 голосов
/ 26 января 2010

Чтобы соответствовать хотя бы одному или нескольким пробельным символам (пробел, табуляция, новая строка), используйте:

\s+

Замените вышеприведенное везде, где у вас есть физическое пространство в вашем шаблоне, и вы должны быть в порядке.

0 голосов
/ 22 июня 2016

С помощью ORegex вы можете токенизировать вашу строку и просто сопоставить шаблон с последовательностями токенов:

var tokens = input.Split(new[]{' ','\t','\n','\r'}, StringSplitOptions.RemoveEmptyEntries);
var oregex = new ORegex<string>("{0}{0}{1}{1}", IsText, IsDate);

var matches = oregex.Matches(tokens); //here is your subsequence tokens.

...

public bool IsText(string str)
{
    ...
}

public bool IsDate(string str)
{
    ...
}
0 голосов
/ 26 января 2010

Это неприятное выражение, но вот что будет работать для предоставленного вами ввода:

^(\w+)\s+([\w@.]+)\s+(\d{2}\/\d{2}\/\d{4})[^\d]+(\d{2}\/\d{2}\/\d{4})$

Это также будет работать с переменным количеством пробелов между группами захвата.

0 голосов
/ 26 января 2010
\b(text)[\s]+(text)[\s]+(date1)[\s]+(date2)\b
0 голосов
/ 26 января 2010

Я бы разбил строку на массив строк и сопоставил каждую результирующую строку с необходимым регулярным выражением.

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