Posix Regular Expression
Posix Regular Expression 是 POSIX 所建立的其中一個標準(並且有 Basic 與 Extended 的分別), 大多數有支援 POSIX 標準的 libc library 都有實作(包含 glibc), 不過實作的細節可能在各個實作上會略有不同。因此,雖然 glibc 有內建,除非要相容於 GNU 工具程式的正規表示式, 否則不一定要使用 Posix Regular Expression。 對於 C 而言,最常被考慮的跨平台 Regular Expression library 為 PCRE 或者是 PCRE2。
下面是 1-9 位數不重複印出來的練習問題(在 Linux 測試,使用 glibc):
#include <stdio.h>
#include <math.h>
#include <regex.h>
int main() {
regex_t re;
int number = 0;
long max = 0;
printf("Please give a number: ");
scanf("%d", &number);
if (number < 1 || number > 9) {
printf("Out of range.\n");
return (1);
}
max = round(pow(10, number)) - 1;
regcomp(&re, "([0-9]).*\\1", REG_EXTENDED);
for (long index = 1; index <= max; index++) {
int value;
char str[10];
sprintf(str, "%ld", index);
value = regexec(&re, str, 0, NULL, 0);
if (value == REG_NOMATCH) {
printf("%ld\n", index);
}
}
regfree(&re);
return 0;
}
PCRE 或者是 PCRE2 都有提供 Posix Regular Expression 相容的 API, 只是 Regular Expression 語法就沒有 Basic 與 Extended 的分別, 而是使用 PCRE 本身的語法。以 PCRE2 來說,只要改為 include pcre2posix.h, 連結時要加上 -lpcre2-posix 與 -lpcre2-8 即可。
#include <stdio.h>
#include <math.h>
#include <pcre2posix.h>
int main() {
regex_t re;
int number = 0;
long max = 0;
printf("Please give a number: ");
scanf("%d", &number);
if (number < 1 || number > 9) {
printf("Out of range.\n");
return (1);
}
max = round(pow(10, number)) - 1;
regcomp(&re, "([0-9]).*\\1", 0);
for (long index = 1; index <= max; index++) {
int value;
char str[10];
sprintf(str, "%ld", index);
value = regexec(&re, str, 0, NULL, 0);
if (value == REG_NOMATCH) {
printf("%ld\n", index);
}
}
regfree(&re);
return 0;
}
C++ Regular Expression
自 C++11 開始,C++ 標準函式庫提供了 Regular Expression library。
下面是 1-9 位數不重複印出來的練習問題:
#include <cmath>
#include <iostream>
#include <regex>
#include <string>
int main() {
int number = 0;
long max = 0;
std::cout << "Please give a number: ";
std::cin >> number;
if (number < 1 || number > 9) {
printf("Out of range.\n");
return (1);
}
max = round(pow(10, number)) - 1;
std::regex re("([0-9]).*\\1", std::regex_constants::ECMAScript);
for (long index = 1; index <= max; index++) {
std::string s = std::to_string(index);
std::smatch m;
std::regex_search(s, m, re);
if (m.empty()) {
std::cout << index << std::endl;
}
}
return 0;
}
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。