Для группы полей вы можете начать с сопоставления не пробельных символов, а затем сопоставить любые непробельные символы.
Поскольку группа полей может содержать пробелы, вы можете повторить это и убедиться, что слова не начинаются с &
или с открывающей и закрывающей скобок.
^(?P<field>(?![^\s&]*&)\S+(?: (?!\([^)]*\)|[^&\s]*&)\S+)*)\s*(?P<col>&[a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?$
^
Начало строки (?P<field>
Поле именованной группы (?![^\s&]*&)\S+
Утверждение того, что справа не содержит &
, затем соответствует 1+ раз непробельному символу [^\s&]\S+
совпадение не с пробельным символом или &
с последующим сопоставлением 1+ раз с непробельным символом (?:
группа без захвата (?!\([^)]*\))\S+
Утвердить, чтосправа не является (
... )
, затем соответствует 1+ раз непробельному символу
)*
Закройте группу без захвата и повторите 0+ раз
)
Закрыть поле группы \s*(?P<col>&[a-zA-Z_]+)?
Соответствовать необязательно col
группа \s*(?P<pos>\(.*?\))?
Соответствовать необязательно pos
группа
Regex demo
Обратите внимание, что вы можете опустить квадратные скобки вокруг [&]