Я пытаюсь работать над шаблоном регулярного выражения, который соответствует слову или набору слов в кавычках, например:

"keyword" ИЛИ "keyword1 keyword2"

И или любой из вышеперечисленных, заканчивающийся тильдой и числом.

"keyword"~3 ИЛИ "keyword1 keyword2"~5

Но не содержит третьей двойной кавычки внутри ключевого слова или двойного набора тильды / чисел

Неудача: "keyword1" keyword2", "keyword"~3~3

Пока что у меня есть это: ^(\[\"\](\[^\"\'\]*)\[\"\])|(\"(\[^\"\'\]*)\"~\d)$/gm

Однако, похоже, что [^\"] не дает сбоев в средней цитате, как я ожидал, и что-то дополнительное в конце, похоже, тоже проходит ...

Любой совет, как я могу сделать это более точным?

0
nclark 27 Окт 2015 в 06:12

2 ответа

Лучший ответ

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

^([\"]([^\"\']*)[\"]) ИЛИ (\"([^\"\']*)\"~\d)$

То есть должно начинаться с X или заканчиваться Y.

Если у вас есть поле в вашем CSV как "this "should fail", оно будет соответствовать первой части вашего регулярного выражения, потому что метасимвол $ не связан с ним, и поэтому проходит проверку.

Если вы заключите все регулярное выражение в круглые скобки (за исключением якорей начала и конца), оно должно работать:

^(([\"]([^\"\']*)[\"])|(\"([^\"\']*)\"~\d))$

Тогда это будет рассматриваться как весь ввод должен соответствовать X или Y полностью.

Или эта более простая версия также должна работать: ^"[^'"]*"(~\d)?$.

0
Daniel Flint 27 Окт 2015 в 04:45

Вам нужно избавиться от этих якорей. Схемы CSV, используемые на этом сайте, происходят от стандарта W3C XML Schema, который определяет свой собственный вид регулярных выражений. Обычно известный как разновидность XSD, она основана на разновидности Perl 5, но поддерживает лишь небольшую часть функций, доступных в Perl и большинстве других его производных.

Одна из этих недостающих функций - якоря. В версии XSD все совпадения неявно привязаны к обоим концам. Это может показаться ужасно ограничивающим, но это не так. Вы всегда можете "дополнить" совпадение, добавив .* на концах, как вы это делаете с методом Java matches(). Но там, где matches() все равно позволяет явно добавлять якоря, XSD - нет. Вне класса символов ^ и $ являются обычными символами.

Помимо этого, регулярное выражение, которое вы ищете, довольно простое:

"[^"]+"(?:~\d+)?

Я обновил вашу скрипку для демонстрации. Обратите внимание, что я использовал якоря в скрипке, но вы не должны этого делать. Это был обходной путь, потому что Regex101 не имеет настройки для представления каждой строки отдельной строкой, как это делают некоторые другие инструменты. Я добавил разделители строк в [^"\r\n] по той же причине; они вам, вероятно, не понадобятся.

0
Alan Moore 27 Окт 2015 в 12:41