Захват квантора Qregexp

#c #regex #qt #qregexp

#c #регулярное выражение #qt #qregexp

Вопрос:

Вот моя проблема
я использую QRegExp в библиотеке QT для захвата выражения prolog, подобного этому

ma(v, c).

с помощью этого регулярного выражения

 ([a-z][A-Za-z0-9]*)(\()([A-Za-z0-9]*,)*([A-Za-z0-9]*)(\))(\.)
  

в этом случае это дает мне

"ma" "(" "v" "," "c"" ")" "." 

но когда я пробую это предложение пролога

ma(v, c, r).

это только дает мне

"ma" "(" "c" ", " "r" ")" "." 

Есть ли способ захватить все кванторы?

Комментарии:

1. Лучший способ для вас — сопоставить весь текст внутри () с \([^()]*\) , а затем обрезать ( и ) и разделить содержимое с помощью ,

Ответ №1:

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

Когда вы вводите ([A-Za-z0-9]*,)* , это не означает, что регулярное выражение вернет ноль или много групп, соответствующих этому шаблону [A-Za-z0-9]*, .

Я предлагаю разделить его на три операции. Один для анализа всей структуры, другой для разделения этого v, c, r с помощью «,» и один для объединения всего:

Операция 1 — используйте это регулярное выражение: ([a-z][A-Za-z0-9]*)(\()((?:[A-Za-z0-9]*,?)*)(\))(\.)

Операция 2 — разделите строку в группе (3) с помощью , для получения каждого элемента.

Операция 3 — объединение: группа (1) группа(2) результат_о_операции_2 группа(4) группа(5)