Вернуть все непересекающиеся совпадения шаблона в строке - PullRequest
2 голосов
/ 13 февраля 2010

В Python я могу использовать re.findall (pattern, string) для возврата всех неперекрывающихся совпадений pattern в строке.

Например, в следующей команде SVG path:

import re
spam = "M317.0,169.7C311.1,170.5 285.7,146.8 300.7,178.57 L 321.4,175.01"
eggs = re.findall("([A-Za-z]|-?[0-9]+\.?[0-9]*(?:e-?[0-9]*)?)", spam)
print(eggs)
['M', '317.0', '169.7', 'C', '311.1', '170.5', '285.7', '146.8', '300.7', '178.5', 'L', '321.4', '175.0']

Это легкий, чистый и эффективный способ для сопоставления с шаблоном регулярных выражений такого типа в C или C ++? Обратите внимание, что я не ищу решение, которое опирается на Boost. В идеале я хотел бы свести к минимуму зависимости и сохранить код в моем коде ...

Ответы [ 2 ]

4 голосов
/ 13 февраля 2010

SLRE - библиотека сверхлегких регулярных выражений

SLRE - это библиотека ANSI C, которая реализует небольшое подмножество регулярных выражений Perl. Он в первую очередь предназначен для разработчиков, которые хотят анализировать файлы конфигурации, где скорость не важна. Он находится в одном файле .c, легко модифицируемом для пользовательских нужд. Например, если кто-то хочет ввести новый метасимвол «\ i», что означает «IP-адрес», это легко сделать. Особенности

* Crossplatform - pure ANSI C
* Very simple API
* Light: about 5kB of code when compiled
* Uses no dynamic memory allocation
* Thread safe

Поддерживаемый синтаксис RE

^ Match beginning of a buffer
$ Match end of a buffer
() Grouping and substring capturing
[...] Match any character from set
[^...] Match any character but ones from set
\s Match whitespace
\S Match non-whitespace
\d Match decimal digit
\r Match carriage return
\n Match newline
+ Match one or more times (greedy)
+? Match one or more times (non-greedy)
* Match zero or more times (greedy)
*? Match zero or more times (non-greedy)
? Match zero or once
\xDD Match byte with hex value 0xDD
\meta Match one of the meta character: ^$().[*+?\

/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * Sergey Lyubka wrote this file. As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.
 * ----------------------------------------------------------------------------
 */
2 голосов
/ 13 февраля 2010

Вам понадобится библиотека регулярных выражений C ++. Их много, но они создадут зависимость. C ++ не имеет встроенной (или STL) поддержки регулярных выражений.

...