Регулярное выражение построчно:Как сопоставить тройные кавычки, но не двойные кавычки
Вопрос
Мне нужно проверить, содержит ли строка из многих слов/букв/т.д. только один набор тройных двойных кавычек (т.е."""), но также может содержать одинарные двойные кавычки ("") и двойные кавычки (""), используя регулярное выражение.Пока особых успехов не добился.
Решение
Регулярное выражение с отрицательным просмотром может сделать это:
(?!.*"{3}.*"{3}).*"{3}.*
Я попробовал это с помощью этих строк Java-кода:
String good = "hello \"\"\" hello \"\" hello ";
String bad = "hello \"\"\" hello \"\"\" hello ";
String regex = "(?!.*\"{3}.*\"{3}).*\"{3}.*";
System.out.println( good.matches( regex ) );
System.out.println( bad.matches( regex ) );
...с выводом:
true
false
Другие советы
Попробуйте использовать оператор количества вхождений, чтобы сопоставить ровно три двойные кавычки.
- \"{3}
- ["]{3}
- [\"]{3}
Я быстро проверил, используя http://www.regextester.com/, кажется, работает нормально.
Однако то, как вы правильно скомпилируете регулярное выражение на выбранном вами языке, может отличаться!
Зависит от вашего языка, но вам нужно сопоставить только три двойные кавычки (например, /\"{3}/
), а затем посчитайте совпадения, чтобы увидеть, есть ли ровно одно.
Вероятно, существует множество способов сделать это, но самый простой — просто найти несколько вхождений тройных кавычек, а затем инвертировать регулярное выражение.Вот пример из Perl:
use strict;
use warnings;
my $match = 'hello """ hello "" hello';
my $no_match = 'hello """ hello """ hello';
my $regex = '[\"]{3}.*?[\"]{3}';
if ($match !~ /$regex/) {
print "Matched as it should!\n";
}
if ($no_match !~ /$regex/) {
print "You shouldn't see this!\n";
}
Какие выходы:
Matched as it should!
По сути, вы говорите ему найти то, чего вы НЕ хотите, а затем искажаете правду.Надеюсь, это имеет смысл.Может помочь вам преобразовать пример на другой язык, если вам нужна помощь.
Это может быть хорошим началом для вас.
^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$
Посмотрите это в действии на regex101.com.