Regex Замена: на ":" и т. Д. - PullRequest
4 голосов
/ 09 января 2009

У меня есть куча строк вроде:

"Hello, here's a test colon:. Here's a test semi-colon&#59;"

Я хотел бы заменить это на

"Hello, here's a test colon:. Here's a test semi-colon;"

И так далее для всех значений ASCII для печати .

В настоящее время я использую boost::regex_search для сопоставления &#(\d+);, создавая строку при обработке каждого совпадения по очереди (включая добавление подстроки, не содержащей совпадений с момента последнего найденного совпадения) .

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

Спасибо

Дом

Ответы [ 12 ]

0 голосов
/ 11 января 2009

Вот сканер NCR, созданный с использованием Flex :

/** ncr2a.y: Replace all NCRs by corresponding printable ASCII characters. */
%%
&#(1([01][0-9]|2[0-6])|3[2-9]|[4-9][0-9]); { /* accept 32..126 */
  /**recursive: unput(atoi(yytext + 2)); skip '&#'; `atoi()` ignores ';' */
  fputc(atoi(yytext + 2), yyout); /* non-recursive version */
}

Чтобы сделать исполняемый файл:

$ flex ncr2a.y
$ gcc -o ncr2a lex.yy.c -lfl

Пример:

$ echo "Hello,  here's a test colon:. 
> Here's a test semi-colon&#59; 'ƒ'
> &#38;#59; <-- may be recursive" \
> | ncr2a

Печатает для нерекурсивной версии:

Hello, &#12; here's a test colon:.
Here's a test semi-colon; '&#131;'
&#59; <-- may be recursive

А рекурсивный производит:

Hello, &#12; here's a test colon:.
Here's a test semi-colon; '&#131;'
; <-- may be recursive
0 голосов
/ 09 января 2009

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

В настоящее время я использую python и решил бы это с помощью oneliner:

''.join([x.isdigit() and chr(int(x)) or x for x in re.split('&#(\d+);',THESTRING)])

Имеет ли это какой-то смысл?

...