Регулярное выражение построчно:Как сопоставить тройные кавычки, но не двойные кавычки

StackOverflow https://stackoverflow.com/questions/1494929

  •  18-09-2019
  •  | 
  •  

Вопрос

Мне нужно проверить, содержит ли строка из многих слов/букв/т.д. только один набор тройных двойных кавычек (т.е."""), но также может содержать одинарные двойные кавычки ("") и двойные кавычки (""), используя регулярное выражение.Пока особых успехов не добился.

Это было полезно?

Решение

Регулярное выражение с отрицательным просмотром может сделать это:

(?!.*"{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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top