Предполагам че на всеки, който пише код рано или късно му се налага да парсва низове. В случай че низът не е нещо кратко, точно и ясно, се налага използването на regex. В различните езици регулярни изрази се ползват по различен начин. Общото е че върху изследвания низ се налага шаблон и според това дали низът попада в шаблона (match-ва) се предприемат някакви действия или части от низа се прехвърлят в други променливи. В Perl това става лесно – има си езикова конструкция:
-
-
$string = "The lazy dog jumped over the quick brown fox.";
-
if ($string =~ /(\w{3}\./){
-
$match = $1;
-
do_something_on($match);
-
}
-
Кракто и ясно – ако низът попада в /шаблон/ – да се направи еди какво си. Няма да се спирам точно върху синтаксиса на шаблоните, понеже самия факт че четете това тук предполага че сте на ясно ![]()
Все пак ако не сте на ясно, ето ви един плашещ шаблон, за да се откажете още тук:
/^([\d\.]+?)\skill\s+(\d+)\s+([\w\s]+?)(\d+?)\s+([\w\s]+?)\w+$/
Това използвам за парсване на тези редове от логовете на Unreal Tournament:
175.48 kill 1 Sniper Rifle 5 Sniper Rifle Decapitated
В PHP няма езикова конструкция, но има доста функции за Perl Compatible Regular Expressions, които работят на същия принцип.
Сега да видим как е положението в С.
От много време търсех как мога да ползвам регулярни изрази, но все удрях на камък. Когато ми се е налагало да парсвам низове съм ползвал sscanf или разбиване на символи, броене, чакане Х-тия символ да е точно ‘А’, Y-тия да е точно ‘B’ и т.н. Неприятна работа включваща жонглиране с цикли, if-ове, strcmp и двадесет нива индентация на кода.
Днес открих че в С има поддръжка на PCRE и ми се дощя да се самоубия ![]()
Ако работите на нормална операционна система, то може да видите много информация с man pcre и man pcreapi. Ако сте наистина щастливци, някъде из дистрибуцията ще имате файл pcredemo.c, който нагледно показва как се работи с PCRE функциите.
Ако не сте от тези щастливци можете да си намерите файла от тук.
Използват се две основни функции: pcre_compile и pcre_exec. Първата поема съставения шаблон от потребителски низов вид и го превръща във вътрешното представяне, което компилатора използва. Втората функция налага шаблона върху тествания низ и връща съвпаденията във вид на масив от вектори, сочещи началните позиции на съвпаденията. Можете да прочетете за функциите в съответните man страници. И най-добре вижте pcredemo.c

