Если честно, я не уверен, почему flex делает то, что он есть. Но чтобы ответить на ваш вопрос о том, как писать регулярные выражения, чтобы обнаружить этот случай:
/^\"(?=.*[\"].*[\"].*[\"])(?=.*[\<]).+?\"$/
Это RegEx будет соответствовать на линии, которая соответствует этим критериям:
- начинается и заканчивается в кавычки
- Содержит 3 кавычки после первого (указывает, что линия содержит две строки)
- Содержит ровно один угловой кронштейн
Потому что я не знаю, соответствуют ли вам именно те критерии, которые вам нужны, я сломаю это регулярное выражение и некоторые важные компоненты.
После проверки первой кавычки, это опережение подпрограмма разобран:
(?=.*[\"].*[\"].*[\"])
Проверяется вперед в RegEx тему, чтобы увидеть, если есть еще три кавычки. Он сопоставляет все, за которым следует кавычек, три раза. Вы можете изменить это, чтобы проверить более или менее кавычки, добавив или удалив часть .*[\"]
.
Далее, у нас есть еще опережения подпрограммы:
(?=.*[\<])
Это проверяет, что есть по крайней мере один угловой кронштейн между первой и последней кавычкой. Если вы хотите проверить другие операции, вы можете добавить их в квадратные скобки в [\<]
, например: [\<\>\=\+]
.
И, наконец, мы сопоставляем любой символ один или несколько раз с .+?
, а затем с окончательной кавычкой: \"
.
Важно отметить, что подпрограммы lookahead фактически не перемещаются по строке, поскольку они выполняют свою проверку. Например, если мы используем регулярное выражение /a(?=a)a/
, оно будет соответствовать только двум последовательным символам 'a', а не трем.
Вот почему первый взгляд, о котором я упоминал выше, пытается найти 3 кавычки после первого.
Возможно, не ответ, который вы искали, но я надеюсь, что это немного поможет.
На самом деле вы должны включить свое регулярное выражение. В противном случае трудно понять, почему он не делает то, что вы ожидаете. – rici