Я решил это недавно, когда пытался сопоставить синтаксис, подобный 1-4,5,9,20-25
.Результирующее регулярное выражение, по общему признанию, не простое:
/\G([0-9]++)(?:-([0-9]++))?+(?:,(?=[-0-9,]+$))?+/
Это выражение позволило мне постепенно собирать все совпадения в строку.
Мы можем применить тот же подход к вашемупроблема, но это чрезвычайно сложно как проверить, так и сопоставить ваш ввод данных.(Я не знаю, как это сделать. Если это сделает кто-то другой, я бы хотел посмотреть!) Но вы можете проверить ввод отдельно:
/\(\s*(\s*((\s*\d+\s+\d+\s*)\)\s*)+\s*\)/
См. Ответ Эвана за то, как это работает.\d
эквивалентно [0-9]
и \s
эквивалентно [\r\n\t ]
.
Это инкрементное совпадение для извлечения чисел:
/\G\(?\s*(?:\(\s*(\d+)\s+(\d+)\s*\))(?:(?=\s*\(\s*\d+\s+\d+\s*\))|\s*\))/
Разбивается так, как:
/\G # matches incrementally. \G marks the beginning of the string or the beginning of the next match.
\(?\s* # matches first open paren; safely ignores it and following whiespace if this is not the first match.
(?: # begins a new grouping - it does not save matches.
\(\s* # first subgroup open paren and optional whitespace.
(\d+) # matches first number in the pair and stores it in a match variable.
\s+ # separating whitespace
(\d+) # matches second number in the pair and stores it in a match variable.
\s*\) # ending whitespace and close paren
) # ends subgroup
(?: # new subgroup
(?= # positive lookahead - this is optional and checks that subsequent matches will work.
\s*\(\s*\d+\s+\d+\s*\) # look familiar?
) # end positive lookahead
| # if positive lookahead fails, try another match
\s*\)\s* # optional ending whitespace, close paren
)/ # ... and end subgroup.
Я не проверял это, но я уверен, что это сработает.Каждый раз, когда вы применяете выражение к заданной строке, оно будет извлекать каждую последующую пару чисел, пока не увидит последнюю закрывающую часть, и не будет использовать всю строку или остановится, если возникнет ошибка ввода.Возможно, вам придется уточнить это для Boost :: regex.Это Perl-совместимое регулярное выражение.