Regex расщепляет строку, сохраняя кавычки - PullRequest
11 голосов
/ 24 января 2011

Мне нужно разбить строку, как показано ниже, на основе пробела в качестве разделителя. Но любое пространство внутри цитаты должно быть сохранено.

research library "not available" author:"Bernard Shaw"

до

research
library
"not available"
author:"Bernard Shaw"

Я пытаюсь сделать это в C Sharp, у меня есть это регулярное выражение: @"(?<="")|\w[\w\s]*(?="")|\w+|""[\w\s]*""" из другого поста в SO, который разбивает строку на

research
library
"not available"
author
"Bernard Shaw"

что, к сожалению, не соответствует моим точным требованиям.

Я ищу любое регулярное выражение, которое бы сработало.

Любая помощь приветствуется.

Ответы [ 2 ]

27 голосов
/ 24 января 2011

До тех пор, пока внутри строк в кавычках не может быть экранированных кавычек, должно работать следующее:

splitArray = Regex.Split(subjectString, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*) (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

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

Регулярное выражение без всех этих кавычек, объяснено:

(?<=      # Assert that it's possible to match this before the current position (positive lookbehind):
 ^        # The start of the string
 [^"]*    # Any number of non-quote characters
 (?:      # Match the following group...
  "[^"]*  # a quote, followed by any number of non-quote characters
  "[^"]*  # the same
 )*       # ...zero or more times (so 0, 2, 4, ... quotes will match)
)         # End of lookbehind assertion.
[ ]       # Match a space
(?=       # Assert that it's possible to match this after the current position (positive lookahead):
 (?:      # Match the following group...
  [^"]*"  # see above
  [^"]*"  # see above
 )*       # ...zero or more times.
 [^"]*    # Match any number of non-quote characters
 $        # Match the end of the string
)         # End of lookahead assertion
3 голосов
/ 24 января 2011

Вот, пожалуйста:

C #:

Regex.Matches(subject, @"([^\s]*""[^""]+""[^\s]*)|\w+")

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

([^\s]*\"[^\"]+\"[^\s]*)|\w+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...