Regex для соответствия символу, но не, когда это включается в кавычки

В зависимости от Вашей среды (т.е. не в Windows), можно пользоваться ncurses библиотекой (а именно, ncurses_noecho () функция для остановки эха клавиатуры и ncurses_getch () для чтения входа) для получения пароля, не отображая его на экране.

14
задан Kirill V. Lyadvinsky 18 September 2009 в 12:31
поделиться

4 ответа

Если реализация регулярного выражения поддерживает утверждения просмотра, попробуйте следующее:

:(?:(?<=["']:)|(?=["']))

Это будет соответствовать любому двоеточию, которому предшествуют или за которым следует двойная или одинарная кавычка. Так что это касается только такой конструкции, как вы упомянули. something: firstValue не будет сопоставлен.

Было бы лучше, если бы вы создали небольшой синтаксический анализатор, который считывает входные данные побайтно и запоминает, когда цитата открыта.

5
ответ дан 1 December 2019 в 15:22
поделиться

Количество скачков в секунду ... пропущено точка. Забудь об остальном. Это довольно сложно сделать, потому что регулярное выражение не подходит для подсчета сбалансированных символов (но, например, реализация .NET имеет расширение, которое может это делать, но оно немного сложнее).

Для этого можно использовать группы с отрицанием символов. .

[^'"]:[^'"]

Вы можете дополнительно заключить кавычки в группы без захвата.

(?:[^'"]):(?:[^'"])

Или вы можете использовать утверждение.

(?<!['"]):(?!['"])
1
ответ дан 1 December 2019 в 15:22
поделиться

Я придумал следующую слегка тревожную конструкцию:

(? <= ^ ('[^'] * ') * ("[^"] * ") * [^ '"] *):

Он использует утверждение просмотра назад, чтобы убедиться, что вы сопоставили четное число кавычек от начала строки до текущего двоеточия. Он позволяет вставлять одинарные кавычки внутри двойных кавычек и наоборот. Пример:

'a ": b': c ::" ': " (соответствует позициям 6, 8 и 9)

РЕДАКТИРОВАТЬ

Гамбо прав, используя * в утверждении просмотра назад не допускается.

0
ответ дан 1 December 2019 в 15:22
поделиться

Регулярные выражения не имеют состояния. Отслеживание того, находитесь ли вы в кавычках или нет, является государственной информацией. Следовательно, невозможно правильно обработать это, используя только одно регулярное выражение. (Обратите внимание, что некоторые реализации «регулярных выражений» добавляют расширения, которые могут сделать это возможным; здесь я говорю исключительно об «истинных» регулярных выражениях.)

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

$string =~ s/['"][^'"]*['"]//g;
my $match_count = $string =~ /:/g;

Первый найдет все последовательности, состоящие из кавычек, за которыми следует любое количество символов без кавычек, и завершится второй кавычкой, и удалит все такие последовательности из строки. Это устранит любые двоеточия, заключенные в кавычки. ( something: "firstValue": 'secondValue' становится something :: и something: 'no: match' становится something: )

Второй выполняет простой подсчет оставшихся двоеточий, то есть тех, которые не были в кавычках, чтобы начать.

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

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

3
ответ дан 1 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: