Я новичок в регулярных выражениях и буду признателен за вашу помощь. Я пытаюсь составить выражение, которое разделит строку примера, используя все пробелы, не окруженные одинарными или двойными кавычками. Моя последняя попытка выглядит так: (?!")
и не совсем работает. Он разбивается на пространство перед цитатой.
Пример ввода:
This is a string that "will be" highlighted when your 'regular expression' matches something.
Желаемый результат:
This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.
Обратите внимание на это "will be"
и 'regular expression'
сохраните пробел между словами.
Ответы:
Я не понимаю, почему все остальные предлагают такие сложные регулярные выражения или такой длинный код. По сути, вы хотите получить из своей строки два типа вещей: последовательности символов, которые не являются пробелами или кавычками, и последовательности символов, которые начинаются и заканчиваются кавычками, без кавычек между ними, для двух типов кавычек. Вы можете легко сопоставить эти вещи с помощью этого регулярного выражения:
Я добавил группы захвата, потому что вам не нужны кавычки в списке.
Этот код Java создает список, добавляя группу захвата, если она соответствует, чтобы исключить кавычки, и добавляя общее совпадение регулярного выражения, если группа захвата не соответствует (было найдено слово без кавычек).
Если вы не возражаете, чтобы в возвращаемом списке были кавычки, вы можете использовать гораздо более простой код:
источник
\"
?John's mother
результаты разделились[John, s, mother]
"([^"]*)"|'([^']*)'|[^\s]+
."([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+
. См stackoverflow.com/questions/5695240/...На StackOverflow есть несколько вопросов, которые охватывают этот же вопрос в различных контекстах с использованием регулярных выражений. Например:
ОБНОВЛЕНИЕ : образец регулярного выражения для обработки строк с одинарными и двойными кавычками. Ссылка: Как я могу разбить строку, кроме как внутри кавычек?
Протестировал это с помощью быстрого фрагмента Perl, и результат был таким, как показано ниже. Также работает для пустых строк или строк, содержащих только пробелы, если они заключены в кавычки (не уверен, желательно это или нет).
Обратите внимание, что это включает сами символы кавычек в совпадающие значения, хотя вы можете удалить это с помощью замены строки или изменить регулярное выражение, чтобы не включать их. Я оставлю это как упражнение для читателя или другого автора, так как 2 часа ночи уже слишком поздно, чтобы больше возиться с регулярными выражениями;)
источник
Если вы хотите разрешить экранированные кавычки внутри строки, вы можете использовать что-то вроде этого:
Цитированные строки будут группой 2, отдельные слова без кавычек будут группой 3.
Вы можете попробовать это на различных строках здесь: http://www.fileformat.info/tool/regex.htm или http://gskinner.com/RegExr/
источник
Регулярное выражение от Яна Гойвертса - лучшее решение, которое я нашел до сих пор, но создает также пустые (нулевые) совпадения, которые он исключает в своей программе. Эти пустые совпадения также появляются в тестерах регулярных выражений (например, rubular.com). Если вы перевернете поиск по кругу (сначала найдите цитируемые части, а затем слова, разделенные пробелами), вы можете сделать это один раз с помощью:
источник
Это будет соответствовать пробелам, не заключенным в двойные кавычки. Мне нужно использовать min, max {0,99999}, потому что Java не поддерживает * и + в ретроспективе.
источник
Вероятно, будет проще искать строку, хватая каждую часть, чем разбивать ее.
Причина в том, что вы можете разделить его на пробелы до и после
"will be"
. Но я не могу придумать никакого способа указать игнорирование пробела между разделителями.(не настоящая Java)
Кроме того, захват одинарных кавычек может привести к проблемам:
источник
String.split()
здесь бесполезен, потому что нет способа отличить пробелы внутри кавычек (не разделять) и те, которые находятся за их пределами (разбивать).Matcher.lookingAt()
наверное то, что вам нужно:который дает следующий результат:
источник
Мне понравился подход Маркуса, однако я изменил его, чтобы разрешить текст рядом с кавычками и поддерживать символы кавычек "и". Например, мне нужно было a = "some value", чтобы не разбивать его на [a =, " какое-то значение "].
источник
Подход Яна великолепен, но вот еще один для протокола.
Если вы действительно хотели разделить, как указано в заголовке, сохранив кавычки в
"will be"
и'regular expression'
, тогда вы можете использовать этот метод, который прямо не соответствует (или заменяет) шаблон, за исключением ситуаций s1, s2, s3 и т. Д.Регулярное выражение:
Два левых чередования соответствуют полному
'quoted strings'
и"double-quoted strings"
. Мы проигнорируем эти совпадения. Правая сторона соответствует и захватывает пробелы в Группу 1, и мы знаем, что это правильные пробелы, потому что они не были сопоставлены выражениями слева. Мы заменяем их наSplitHere
затем разделенныеSplitHere
. Опять же, это для настоящего случая разделения, когда вы хотите"will be"
, а неwill be
.Вот полная рабочая реализация (см. Результаты в онлайн-демонстрации ).
источник
Если вы используете C #, вы можете использовать
Я специально добавил " | <(? [\ W \ s] *)> ", чтобы подчеркнуть, что вы можете указать любой символ для группировки фраз. (В этом случае я использую <> для группировки.
Выход:
источник
Я уверен, что это невозможно, используя только регулярные выражения. Проверка того, что что-то содержится внутри какого-либо другого тега, является операцией синтаксического анализа. Это похоже на ту же проблему, что и при попытке проанализировать XML с помощью регулярного выражения - это невозможно сделать правильно. Вы можете получить желаемый результат, многократно применяя нежадное неглобальное регулярное выражение, которое соответствует цитируемым строкам, а затем, как только вы не сможете найти что-либо еще, разделите его на пробелы ... которые имеют ряд проблемы, включая отслеживание исходного порядка всех подстрок. Лучше всего написать действительно простую функцию, которая выполняет итерацию по строке и извлекает нужные вам токены.
источник
Пара, надеюсь, полезных настроек принятого ответа Яна:
источник
you're
Вы также можете попробовать это:
источник
Следующее возвращает массив аргументов. Аргументы - это переменная command, разделенная пробелами, если они не заключены в одинарные или двойные кавычки. Затем совпадения модифицируются для удаления одинарных и двойных кавычек.
источник
1-й однострочный с использованием String.split ()
[This, is, a, string, that, "will be", highlighted, when, your, 'regular expression', matches, something.]
не разделять пробел, если пробел заключен в одинарные или двойные кавычки,
разделенный на пробел, когда 255 символов слева и все символы справа от пробела не являются ни одинарными, ни двойными кавычками
адаптировано из оригинального сообщения (обрабатывает только двойные кавычки)
источник