Регулярное выражение - Как найти слова и фразы в кавычках - PullRequest
1 голос
/ 22 июня 2010

Я хочу взять строку, скажем, следующую:

Guiness Harp "Holy Moses"

, чтобы в C # или VB получить набор совпадений:

Guiness
Harp
Holy Moses

По существу, он разделяется напробелы, если между ними нет кавычек, тогда эти слова между кавычками считаются одной фразой.

Спасибо, Кевин

Ответы [ 4 ]

5 голосов
/ 22 июня 2010

Если внутри ваших строк в кавычках нет (экранированных или удвоенных) кавычек, вы можете выполнить поиск

 "[^"]*"|\S+

Однако кавычки будут частью совпадения.Регулярное выражение может быть расширено для обработки кавычек внутри строк в кавычках, если это необходимо.

Другая (и в данном случае предпочтительная) возможность - использовать синтаксический анализатор csv.

Например (Python):

import csv
reader = csv.reader(open('test.txt'), delimiter=' ', quotechar='"')
for row in reader:
    print(row)
3 голосов
/ 23 июня 2010

Вот еще один подход:

string s0 = @"Guiness Harp ""Holy Moses""";
Regex r = new Regex(@"""(?<FIELD>[^""]*)""|(?<FIELD>\S+)");
foreach (Match m in r.Matches(s0))
{
  Console.WriteLine(m.Groups["FIELD"].Value);
}

Это использует тот факт, что регулярные выражения .NET позволяют повторно использовать имена групп внутри одного и того же регулярного выражения.Очень немногие разновидности regex допускают это, и из них только Perl 6 столь же гибок в этом, как и .NET.

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

Если это простой синтаксический анализ, вы можете обрезать начальные и конечные кавычки.

string text = "Guiness Harp \"Holy Moses\"";
string pattern = @"""[^""]*""|\S+";

MatchCollection matches = Regex.Matches( text, pattern );
foreach( Match match in matches )
{
    string value = match.Value.Trim( '"' );
    Console.Out.WriteLine( value );
}

Однако эта реализация не очень гибкая.Я бы использовал что-то подобное только во внутреннем инструменте.Или вы не против выбросить свой код.

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

Регулярные выражения не могут сосчитать, что затрудняет разбор разделителей.

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

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