正则表达式用于文本中查找
通配符则用于应用中Shell
正则表达式:动态规划实现
bool regular_regex(string text, string pattern)
{
string new_pattern;
int index = 0;
bool isFirst = true;
for (int i = 0; i < pattern.size(); i++) {
if (pattern.at(i) == '*') {
if (isFirst) {
new_pattern.push_back(pattern.at(i));
isFirst = false;
}
}
else {
new_pattern.push_back(pattern.at(i));
isFirst = true;
}
}
pattern = new_pattern;
const size_t row = text.size() + 1;
const size_t col = pattern.size() + 1;
vector<vector<bool>*> dp_table;
for (int i =0 ;i < row; i++) {
dp_table.push_back(new vector<bool>(col, false));
}
dp_table.at(0)->at(0) = true;
for (int i = 1; i < col; i++) {
if (pattern.at(i-1) == '*') {
dp_table.at(0)->at(i) = dp_table.at(0)->at(i-2);
}
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (pattern.at(j-1) == '.' || pattern.at(j-1) == text.at(i-1)) {
dp_table.at(i)->at(j) =dp_table.at(i-1)->at(j-1);
}
else if (pattern.at(j-1) == '*') {
dp_table.at(i)->at(j) = dp_table.at(i)->at(j-2);
if (text.at(i-1) == pattern.at(j-2) || pattern.at(j-2) == '.')
dp_table.at(i)->at(j) = dp_table.at(i)->at(j) || dp_table.at(i-1)->at(j);
}
}
}
return dp_table.at(row-1)->at(col-1);
}
通配符:动态表达式实现
bool wild_card(string text, string pattern)
{
string new_pattern;
int index = 0;
bool isFirst = true;
for (int i = 0; i < pattern.size(); i++) {
if (pattern.at(i) == '*') {
if (isFirst) {
new_pattern.push_back(pattern.at(i));
isFirst = false;
}
}
else {
new_pattern.push_back(pattern.at(i));
isFirst = true;
}
}
pattern = new_pattern;
const size_t row = text.size() + 1;
const size_t col = pattern.size() + 1;
vector<vector<bool>*> dp_table;
for (int i =0 ;i < row; i++) {
dp_table.push_back(new vector<bool>(col, false));
}
dp_table.at(0)->at(0) = true;
for (int i = 1; i < col; i++) {
if (pattern.at(i-1) == '*') {
dp_table.at(0)->at(i) = dp_table.at(0)->at(i-1);
}
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (pattern.at(j-1) == '?' || pattern.at(j-1) == text.at(i-1)) {
dp_table.at(i)->at(j) =dp_table.at(i-1)->at(j-1);
}
else if (pattern.at(j-1) == '*') {
dp_table.at(i)->at(j) = (dp_table.at(i-1)->at(j) || dp_table.at(i)->at(j-1));
}
}
}
return dp_table.at(row-1)->at(col-1);
}