Лучшие практики cmake

При работе с cmake лучше работать с одним большим CMakeLists.txt в корне проекта, или, как кажется, кое-где видно,

^(([a-z])(?1)\2|[a-z]?)$

Насколько я понимаю, это выражение должно соответствовать либо нулю, либо одному символу (каждая строка из менее чем 2 символов неявно является палиндромом, а также учитывать палиндромы с нечетной длиной в рекурсии) или два из тот же символ, разделенный рекурсией шаблона.

К сожалению, похоже, что это не работает таким образом, как вы можете видеть на www.ideone.com/a9T3F . Вместо этого только строки 2 n - 1 (т.е. пустая строка, a , aaa , aaaaaaa , a 15 ) повторяющиеся символы соответствуют регулярному выражению.

Как ни странно, если я изменю свой шаблон так, чтобы рекурсия стала необязательной (например, ^ (([az]) (? 1)? \ 2 | [az]?) $ , см. www.ideone.com/D6lJR , он соответствует только строкам, в которых символ повторяется 2 n раз (например, пустая строка, a , aa , aaaa , aaaaaaaa , a 16 ).

Почему мое регулярное выражение не работает так, как я ожидал?

Примечание для людей, которым не терпится предложить не использовать регулярное выражение :
Суть этого вопроса - научиться правильно использовать рекурсивные регулярные выражения. Я знаю, что это неэффективный способ определить, является ли строка палиндромом, и я бы не стал использовать рекурсивное регулярное выражение, если бы мне по какой-то причине пришлось определять палиндромы в производственном коде; Мне просто интересно узнать больше о расширенных аспектах регулярного выражения.

6
задан Community 23 May 2017 в 12:10
поделиться