Как анализировать текст и прощать пробелы, ища определенные функции или шаблоны в .NET? - PullRequest
0 голосов
/ 16 февраля 2012

Я хотел бы найти некоторые передовые методы, как анализировать текстовые блоки в поисках функционально-подобного текста и прощать пробелы в тексте, не прибегая к настройке и использованию ANTLR (или чего-то подобного) только для этого. один случай. Единственное, что нужно искать при разборе, - это вариации одного конкретного элемента.

Пример. В приведенном ниже примере я хотел бы узнать, какое значение имеют текст, обязательный и тип, если они присутствуют. Они могут не все присутствовать. В текстовых блоках 1 и 2 я хотел бы знать, что значения обоих элементов одинаковы, когда анализируются заинтересованные значения. Текст - это «Что такое текст метки», это Обязательное - истина, и этот Тип - ноль или не указан при игнорировании или прощении всего пробела.

1. This is user entered text. {{Text="What is the label text {{ Ignore me and treat me as text }}?",Required=true              }}. I am some more user added {} text. 
2. This is user entered text. {{ Text     ="What is the label text {{ Ignore me and treat me as text }}?", Required=       True}}. I am some more user added {} text. 
3. This is user entered text. {{Text="What is the label text?",Type=Date}}. I am some more user added {} text. 
4. This is user entered text. {{ Text = "What is the label text?", Type = Date }}I am some more user added {} text. 
5. This is user entered text. {{ Text = "What is the label text?", Type = Date, Required = True }}I am some more user added {} text. 

Ответы [ 3 ]

0 голосов
/ 16 февраля 2012

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

Text\s*=\s*\"(?<Text>.*)\".*Type\s*=\s*(?<Type>\w*).*Required\s*=\s*(?<Required>\w*) будет соответствовать, когда присутствуют все три части.

Text\s*=\s*\"(?<Text>.*)\".*Type\s*=\s*(?<Type>\w*) будет совпадать, если отсутствует 'Required'.

Text\s*=\s*\"(?<Text>.*)\".*Required\s*=\s*(?<Required>\w*) будет совпадать, если отсутствует 'Type'.

Use может попробовать эти выражения, используя это Парсер регулярных выражений .

0 голосов
/ 16 февраля 2012
var re = new Regex(@"(?i){{(?:[\s,]*(?:Text\s*=\s*""((?:[^""\\]|\\.)+)""|Type\s*=\s*(\w+)|Required\s*=\s*(\w+)))+");
foreach (Match m in re.Matches(text)) {
    Console.WriteLine("Text: {0}\nType: {1}\nRequired: {2}\n", m.Groups[1], m.Groups[2], m.Groups[3]);
}

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

0 голосов
/ 16 февраля 2012

Поскольку я не вижу вложенности в ваших примерах, подойдут регулярные выражения.

...