【编译原理】【词法分析】【正则表达式】【NFA】【DFA】【C++】正则表达式转DFA&NFA,判断字符串是否符合正则表达式的匹配算法

这篇具有很好参考价值的文章主要介绍了【编译原理】【词法分析】【正则表达式】【NFA】【DFA】【C++】正则表达式转DFA&NFA,判断字符串是否符合正则表达式的匹配算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

正则表达式转DFA&NFA

显然,正则表达式、NFA、DFA的概念都很简单,所以直接上代码,注释应该解释地比较清楚,没有万能头文件的自行替换需求库,如果有疑问的可以留言。

网盘链接
[自行补全]/s/1pbGT_wpB662TwFrnukXgGQ?pwd=TSIT
提取码:TSIT

运行截图

【编译原理】【词法分析】【正则表达式】【NFA】【DFA】【C++】正则表达式转DFA&NFA,判断字符串是否符合正则表达式的匹配算法
【编译原理】【词法分析】【正则表达式】【NFA】【DFA】【C++】正则表达式转DFA&NFA,判断字符串是否符合正则表达式的匹配算法
【编译原理】【词法分析】【正则表达式】【NFA】【DFA】【C++】正则表达式转DFA&NFA,判断字符串是否符合正则表达式的匹配算法

原理可以参考这篇博客传送门

本次程序由四个文件组成文章来源地址https://www.toymoban.com/news/detail-506258.html

文件名 描述
Regular_Expression.cpp 处理正则表达式
NFA.cpp 正则表达式转NFA
DFA.cpp NFA转DFA
MainProcess.cpp 主要处理程序
//Regular_Expression.cpp
#ifndef __REGULAR_EXPRESSION__
#define __REGULAR_EXPRESSION__

#include<bits/stdc++.h>
using namespace std;


const int OPERANDS = 1; // 操作符
const int OPERATOR = 2; // 运算符
const int ILLEGAL_CHAR = -1;  // 非法字符

// 正则表达式包含非法字符
class Regular_Expression_Input_Exception
{   
    public:
    char c;
    Regular_Expression_Input_Exception(char c)
    {
        this->c = c;
    }
    string what()const
    {   
        string ret;
        ret = c + " is not in the charset" ;
        return ret;
    }
};

// 正则表达式格式错误
class Regular_Expression_Format_Exceprion
{
    public:
    Regular_Expression_Format_Exceprion(){}
    string what()const
    {
        string ret;
        ret = "Format Error ";
        return ret;
    }
};

class Regular_Expression
{   
    public:

    Regular_Expression(string & s)
    {
        expression = s;
        expression = Regular_Expression_Pretreatment(expression);
        expression = Regular_Expression_Infix2PostFix(expression);
    }

    string get_postfix()
    {
        return expression;
    }

    private:
    string expression;
    inline string Regular_Expression_Pretreatment(string&);
    inline string Regular_Expression_Infix2PostFix(string&);
};

// 返回字符类型
int get_chartype(char c)
{
    if  (   ('a' <= c && c <= 'z')||
            ('A' <= c && c <= 'Z')||
            ('0' <= c && c <= '9')||
            (c == '.')
        ) return OPERANDS;

    if  (   (c == '|')  ||  
            (c == '*')  ||
            (c == '(')  ||  
            (c == ')')  || 
            (c == '&')
        ) return OPERATOR;
    return ILLEGAL_CHAR;
}

// 设置操作符优先级
int get_priorioty(char c)
{
    switch (c)
    {
        case '*':   return 3;   break;
        case '&':   return 2;   break;
        case '|':   return 1;   break;
        case '(':   return 0;   break;
        default:    return ILLEGAL_CHAR;    break;
    }
}

//检查并预处理正则表达式 添加&作为连接符
string Regular_Expression::Regular_Expression_Pretreatment(string & pre_expression)
{
    
    assert(pre_expression.size() > 0);

    string treated_expression;
    try
    {   
        char prechar ;
        int pretype ;
        char nchar = pre_expression[0];
        int ntype = get_chartype(nchar);

        if(ntype == ILLEGAL_CHAR) throw Regular_Expression_Input_Exception(nchar);

        treated_expression.push_back(nchar);
        prechar = nchar;
        pretype = ntype;

        int len = pre_expression.length();

        for(int i = 1 ; i<len ; ++i)
        {
            nchar = pre_expression[i];
            ntype = get_chartype(nchar);

            if(ntype == ILLEGAL_CHAR) throw Regular_Expression_Input_Exception(nchar);

            // 当第一位是操作数 , * , )且第二位为操作数或(
            if( (pretype == OPERANDS || prechar == '*' || prechar == ')'  ) && 
                (ntype == OPERANDS || nchar == '(')
                ) 
            // 使用 & 作为连接符
            treated_expression.push_back('&');
            treated_expression.push_back(nchar);

            pretype = ntype;
            prechar = nchar;
        }

        return treated_expression;

    }
    catch(const Regular_Expression_Input_Exception& e)
    {
        std::cerr << e.what() << "\n";
        exit(0);
    }
    catch(const exception& e)
    {
        std::cerr << e.what() << "\n";
        exit(0);
    }

    return treated_expression;
}

// 正则表达式的中缀表达式转成后缀表达式
string Regular_Expression::Regular_Expression_Infix2PostFix(string & pre_expression)
{

    assert(pre_expression.size() > 0);

    string treated_expression;

    try
    {
        vector<char> op;

        int len = pre_expression.length();        

        int ntype ;
        char nchar;

        for(int i=0 ; i<len ; ++i)
        {
            nchar = pre_expression[i];
            ntype = get_chartype(nchar);

            if(ntype == ILLEGAL_CHAR) throw Regular_Expression_Input_Exception(nchar);

            // 遇到 ( 直接压入栈中;
            if(nchar == '(')
            {
                op.push_back(nchar);
            }
            
            // 遇到 ) 将运算符出栈并输出,直到遇到 ( ,将 ( 出栈但不输出
            else if(nchar == ')')
            {
                while(!op.empty() && op.back() != '(')
                {
                    treated_expression.push_back(op.back());
                    op.pop_back();
                }

                // 没有左括号匹配
                if(op.empty()) throw Regular_Expression_Format_Exceprion();

                // 弹出左括号
                op.pop_back();
            }
            /*  遇到 * 、 & 、 | 运算符:
                如果栈为空,直接将运算符压入栈中;
                如果栈不为空,弹出栈中优先级大于等于当前运算符的运算符并输出,再将当前运算符入栈。
            */
            else if(ntype == OPERATOR)
            {   
                int npriority = get_priorioty(nchar);
                while(!op.empty() && get_priorioty(op.back()) >= npriority)
                {
                    treated_expression.push_back(op.back());
                    op.pop_back();
                }
                op.push_back(nchar);
            }

            else if(ntype == OPERANDS)
            {
                treated_expression.push_back(nchar);
            }
        }

        while(!op.empty())
        {
            nchar = op.back();
            
            // 缺少右括号匹配
            if(nchar == '(') throw Regular_Expression_Format_Exceprion();

            treated_expression.push_back(nchar);
            op.pop_back();
        }
        
        return treated_expression;
    }
    
    catch(const Regular_Expression_Input_Exception& e)
    {
        std::cerr << e.what() << "\n";
        exit(0);
    }
    catch(const Regular_Expression_Format_Exceprion& e)
    {
        std::cerr << e.what() << "\n";
        exit(0);
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
        exit(0);
    }

    return treated_expression;   
}



// #ifndef __MAINPROCESS__
// int main()
// {
//     #ifdef __LOCAL
//     freopen("usrin.txt", "r", stdin);
//     freopen("usrout.txt", "w", stdout);
//     #endif

//     string str;
//     cin >> str;
//     Regular_Expression reg(str);
//     cout << reg.get_postfix() << "\n";
// }
// #endif

#endif
//NFA.cpp
#ifndef __NFA__
#define __NFA__

#include "Regular_Expression.cpp"
#include<bits/stdc++.h>
using namespace std;
struct Nfastate
{   

    // '#' 视为空转移
    Nfastate(char c = '#' , Nfastate* trans = NULL , vector<Nfastate*> vec = vector<Nfastate*>())
    {
        input = c;
        chTrans = trans;
        epTrans.clear();
        for(auto x:vec) epTrans.insert(x);
    }

    void add_New_epTrans(Nfastate& n)
    {
        epTrans.insert(&n);
    }

    void add_New_epTrans(Nfastate* n)
    {
        epTrans.insert(n);
    }

    void add_new_epTrans(vector<Nfastate*> &vec)
    {
        for(auto x:vec) epTrans.insert(x);
    }

    void print();
    set<Nfastate*> closure();
    char input;                 // 转移字符
    Nfastate* chTrans;          // 转移到的状态
    set<Nfastate*> epTrans;     //  空转移状态集合
};

set<Nfastate*> Nfastate::closure()
{
    set<Nfastate*> s;
    
    s.insert(this);

    bool hasnewnode = 1;

    while(hasnewnode)
    {
        hasnewnode = 0;
        for(auto x:epTrans)
        {
            if(s.find(x) == s.end())
            {
                hasnewnode = 1;
                s.insert(x);
            }
        }
    }

    return s;

}

void Nfastate::print()
{
    cerr << "------Nfastate---------\n";
    cerr << "input = " << input << "\n";
    cerr << "chTrans = " << chTrans << "\n";
    cerr << "epTrans = {" ;
    for(auto x:epTrans) cerr << x << " ";
    cerr << "}\n---------------------------------\n";
}

struct subNFA
{
    subNFA(Nfastate* phead = NULL , Nfastate* ptail = NULL)
    {
        head = phead;
        tail = ptail;
    }
    subNFA(Nfastate& ohead , Nfastate & otail)
    {
        head = &ohead;
        tail = &otail;
    }

    subNFA(char c)
    {
        Nfastate *ntail = new Nfastate;
        Nfastate *nhead = new Nfastate(c , ntail);


        // fix1
        if(c == '#') nhead->chTrans = NULL;

        head = nhead;
        tail = ntail;
    }

    void operator=(const subNFA& ele)
    {
        head = ele.head;
        tail = ele.tail;
    }

    void print();
    Nfastate *head;             // 头部指针
    Nfastate *tail;             //  尾部指针
};


void subNFA::print()
{
    int nodecnt = 0;
    map<Nfastate* , int> mp;



    queue<Nfastate*> q;
    q.push(head);

    mp[head] = ++nodecnt;

    auto addnode = [&](Nfastate* e)
    {
        if(mp.count(e)) return mp[e];
        mp[e] = ++nodecnt;
        q.push(e);
        return mp[e];
    };

    while(!q.empty())
    {
        Nfastate* now = q.front();
        q.pop();


        std::cout << "node : " << mp[now] << "\n";
        if(now->chTrans != NULL) 
        {
            addnode(now->chTrans);
            std::cout << "    chTrans : " << now->input << "\n";
            std::cout << "    Transnode : " << mp[now->chTrans] << "\n";
        }
        if(!now->epTrans.empty())
            std:: cout <<"    epTrans : {";

        bool first = 1;
        for(auto x:now->epTrans)
        {
            addnode(x);
            std::cout << (first?"":" , ") << mp[x] ; 
            first = 0;
        }
        if(!now->epTrans.empty())
            std::cout << "}\n";
        
        cout << "\n";
    }

    std::cout << "Start node: "<< mp[head] << "\n";
    std::cout << "End node : " << mp[tail] << "\n";
}

class NFA
{
    public:
    NFA(string &expression):reg(expression),subnfa()
    {
        // cerr << reg.get_postfix() << "\n";
        Build_NFA();
    }   

    void print();
    void Build_NFA();
    Nfastate* gethead();
    Nfastate* gettail();
    private:
    subNFA subnfa;              // 最终的NFA
    Regular_Expression reg;     // 正则表达式转换
                 
};

Nfastate* NFA::gethead(){return subnfa.head;}
Nfastate* NFA::gettail(){return subnfa.tail;}

void NFA::print()
{   
    //debug
    // std::cout << nfa.head << " " << nfa.tail << "\n"; 
    std::cout << reg.get_postfix() << "\n";
    subnfa.print();
}

void NFA::Build_NFA()
{
    string expression = reg.get_postfix();
    vector<subNFA> sta_nfa;     // nfa栈

    try
    {
        int len = expression.length();
        for(int i=0 ; i<len ; ++i)
        {
            char nchar = expression[i];
            int ntype = get_chartype(nchar);

            //如果遇到操作数a,则新建一个NFA,转换弧上的值为a,将这个NFA压入栈中
            if(ntype == OPERANDS)
            {
                subNFA n(nchar);
                sta_nfa.push_back(n);

                //debug
                // cerr << nchar << ' ' << n.head->input << "\n";
                // cerr << n.head << " " << n.tail << "\n";
                // n.head->print();
                // n.tail->print();
            }
            else if(nchar == '*')
            {
                // 取不出一个元素
                if(sta_nfa.size() < 1) throw Regular_Expression_Format_Exceprion();
                subNFA n1 = sta_nfa.back();
                sta_nfa.pop_back();

                subNFA n('#');

                (*n.head).add_New_epTrans(n1.head);
                (*n1.tail).add_New_epTrans(n.tail);
                (*n1.tail).add_New_epTrans(n.head);

                sta_nfa.push_back(n);

            }
            else if(nchar == '|')
            {
                // 取不出两个元素
                if(sta_nfa.size() < 2) throw Regular_Expression_Format_Exceprion();

                subNFA n1 = sta_nfa.back();
                sta_nfa.pop_back();
                subNFA n2 = sta_nfa.back();
                sta_nfa.pop_back();

                subNFA n('#');
                
                //debug
                // n.head->print();
                // n.tail->print();


                (*n.head).add_New_epTrans(n1.head);
                (*n.head).add_New_epTrans(n2.head);
                (*n1.tail).add_New_epTrans(n.tail);
                (*n2.tail).add_New_epTrans(n.tail);


                //debug
                // n.head->print();
                // n.tail->print();

                sta_nfa.push_back(n);

            }
            else if(nchar == '&')
            {
                // 取不出两个元素
                if(sta_nfa.size() < 2) throw Regular_Expression_Format_Exceprion();
                subNFA n2 = sta_nfa.back();
                sta_nfa.pop_back();
                subNFA n1 = sta_nfa.back();
                sta_nfa.pop_back();

                (*n1.tail).add_New_epTrans(n2.head);
                n1.tail = n2.tail;

                sta_nfa.push_back(n1);

            }
            else throw Regular_Expression_Format_Exceprion();
        }
        if(sta_nfa.size() != 1) throw Regular_Expression_Format_Exceprion();

        subnfa = sta_nfa[0];
    }

    catch(const Regular_Expression_Input_Exception& e)
    {
        std::cerr << e.what() << "\n";
        exit(0);
    }
    catch(const Regular_Expression_Format_Exceprion& e)
    {
        std::cerr << e.what() << "\n";
        exit(0);
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
        exit(0);
    }
    

}


// #ifndef __MAINPROCESS__
// int main()
// {
//     #ifdef __LOCAL
//     freopen("usrin.txt", "r", stdin);
//     freopen("usrout.txt", "w", stdout);
//     #endif

//     string str;
//     cin >> str;

//     NFA nfa(str);
//     nfa.print();
// }
// #endif


#endif
//DFA.cpp
#ifndef __DFA__
#define __DFA__

#include <bits/stdc++.h>
#include "NFA.cpp"
using namespace std;


struct Dfastate
{   
    // 获取对于字符c的闭包
    Dfastate move(char c , Nfastate* tail)
    {
        Dfastate ret;
        for(auto x:closure)
        {
            if(x->input == c) ret.closure.insert(x->chTrans);
        }
        ret.n_closure(tail);

        return ret;
    }

    void n_closure(Nfastate*);
    void upGrade_End_info(Nfastate*);
    bool isEnd;                 //判断是否是结束状态
    set<Nfastate*> closure;     //闭包
    void print();
    bool operator<(const Dfastate& b) const;
    bool operator>(const Dfastate& b) const;
    bool operator==(const Dfastate& b) const;
};

void Dfastate::print()
{
    cerr << "----------Dfastate-------------\n";
    for(auto x:closure) cerr << x << " "; cerr << "\n";
    cerr << (isEnd ? "YES" : "NO") << "\n";
    cerr << "-------------------------------\n\n";
}

bool Dfastate::operator<(const Dfastate& b)const
{   
    //debug
    // cerr << " < \n";
    return closure < b.closure;
}
bool Dfastate::operator>(const Dfastate& b)const
{
    //debug
    // cerr << " > \n";
    return closure > b.closure;
}
bool Dfastate::operator==(const Dfastate& b)const
{
    //debug
    // cerr << " == \n";
    return closure == b.closure;
}


void Dfastate::upGrade_End_info(Nfastate* tail)
{
    if(closure.find(tail) != closure.end()) isEnd = true;
    else isEnd = false;
}

void Dfastate::n_closure(Nfastate * tail)
{
    bool hasnewnode = 1;

    while(hasnewnode)
    {
        hasnewnode = 0;
        for(auto x:closure)
        {

            for(auto y:x->epTrans)
            {
                if(closure.find(y) == closure.end())
                {
                    hasnewnode = 1;
                    closure.insert(y);
                }
            }
            
        }
    }

    upGrade_End_info(tail);
}

struct subDFA
{
    bool isEnd;                 //是否是结束状态
    map<int , subDFA*> to;      //转移图
};

class DFA
{   
    public:
    DFA(string &expression)
    {
        // expression = str;
        for(auto x:expression)
        {
            int ntype = get_chartype(x);
            if(ntype == OPERANDS) charset.insert(x);
            if(ntype == ILLEGAL_CHAR) 
            {
                cerr << "ILLEGAL CHARACHTER\n";
                exit(0);
            }
        }
        Build_DFA(expression);

        //debug
        // for(auto x:charset) 
        // {
        //     cerr << x << " ";
        // }
    }
    void print();
    bool match(string&);
    private:
    void Build_DFA(string&);
    set<char> charset;          //用到的字符集
    subDFA* dfahead;               //DFA的初始状态
    // string expression;
};

bool DFA::match(string& matchstr)
{   
    subDFA* nowp = dfahead;

    if(nowp == NULL) return false;

    for(auto ch:matchstr)
    {   
        if(!nowp->to.count(ch)) return false;
        nowp = nowp->to[ch];
    }
    
    return nowp->isEnd;
}

void DFA::print()
{
    int nodecnt = 0;
    map<subDFA* , int> mp;

    queue<subDFA*> q;
    q.push(dfahead);
    mp[dfahead] = ++nodecnt;

    while(!q.empty())
    {
        subDFA * now = q.front();
        q.pop();

        for(auto next:now->to)
        {
            if(mp.count(next.second)) continue;
            else
            {
                mp[next.second] = ++nodecnt;
                q.push(next.second);
            }
        }
    }

    for(auto x:mp)
    {
        cout << "node[" << x.second <<"] : ";
        for(auto y:x.first->to)
        {
            cout << "(" << char(y.first) << " , " << mp[y.second] << ") ";
        }
        cout << "isEnd : " << ( (x.first->isEnd) ? "YES" : "NO" );
        cout << "\n";
    }
}

void DFA::Build_DFA(string & expression)
{
    NFA nfa(expression);
    Nfastate* head = nfa.gethead();
    Nfastate* tail = nfa.gettail();


    map<Dfastate , subDFA*> mp_Dfastate_PsubDFA;
    queue<Dfastate> q_Dfastate;

    // 获取初始状态的闭包
    Dfastate T;
    T.closure.insert(head);


    //debug
    // T.print();

    T.n_closure(tail);

    // T.print();

    //初始化map queue 以及转移的初始状态
    mp_Dfastate_PsubDFA[T] = new subDFA;
    mp_Dfastate_PsubDFA[T]->isEnd = T.isEnd;

    q_Dfastate.push(T);
    dfahead = mp_Dfastate_PsubDFA[T];

    while(!q_Dfastate.empty() )
    {
        T = q_Dfastate.front();
        q_Dfastate.pop();
        
        //debug
        // T.print();

        subDFA* now = mp_Dfastate_PsubDFA[T];

        for(auto ch:charset)
        {
            Dfastate next = T.move(ch , tail);

            //debug
            // cerr << "char = " << ch << "\n";
            // next.print();

            if(next.closure.empty()) continue;
            
            //状态没出现过就新建节点并加入队列
            if(!mp_Dfastate_PsubDFA.count(next))
            {
                mp_Dfastate_PsubDFA[next] = new subDFA;
                mp_Dfastate_PsubDFA[next]->isEnd = next.isEnd;
                q_Dfastate.push(next);
            }

            now->to[ch] = mp_Dfastate_PsubDFA[next];
        }
    }

    //debug
    // cerr << mp_Dfastate_PsubDFA.size() << "\n";
} 

const string Digit =  "(0|1|2|3|4|5|6|7|8|9)" ;
const string Pos_Digit = "(1|2|3|4|5|6|7|8|9)";

// #ifndef __MAINPROCESS__
// int main()
// {
//     #ifdef __LOCAL
//     freopen("usrin.txt", "r", stdin);
//     freopen("usrout.txt", "w", stdout);
//     #endif

//     string str;
    
//     string interger = "(0|" + Pos_Digit + Digit + "*)";
//     string decimal = "(0|" + Digit + "*" + Pos_Digit + ")";

//     string pat = "(" + interger + ")|(" + interger + "." + decimal + ")"; 
//     cout << pat  << "\n";

//     DFA dfa(pat);
//     dfa.print();

//     cin >> str;
//     cout << dfa.match(str);
// }
// #endif

#endif
//Main_Process.cpp
#ifndef __MAINPRECESS__
#define __MAINPROCESS__

#include<bits/stdc++.h>
#include "DFA.cpp"
using namespace std;

int main()
{

    #ifdef __LOCAL
    freopen("usrin.txt", "r", stdin);
    freopen("usrout.txt", "w", stdout);
    #endif

    string str;
    
    string interger = "(0|" + Pos_Digit + Digit + "*)";
    string decimal = "(0|" + Digit + "*" + Pos_Digit + ")";

    string pat = "(" + interger + ")|(" + interger + "." + decimal + ")"; 

    // pat = "(eedd";
    
    // pat 为正规式
    // str 为待检测的字符串
    pat = "(a|b)*acd*(c|d)";
    str = "aacdc";

    cout <<"Regular_Expression : " <<  pat  << "\n";
    // cin >> str;
    cout << "MatchString : " << str << "\n\n";

    // 构建DFA
    DFA dfa(pat);

    cout << "DFA GRAPH EXPRESSION:\n";

    // 输出DFA
    dfa.print();
    cout << "\n";

    //判断是否符合
    cout << (dfa.match(str) ? "Legal\n" : "Illegal\n");
}

#endif

到了这里,关于【编译原理】【词法分析】【正则表达式】【NFA】【DFA】【C++】正则表达式转DFA&NFA,判断字符串是否符合正则表达式的匹配算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Python数据分析技术栈》第03章 01 正则表达式(Regular expressions)

    《Python数据分析技术栈》第03章 01 正则表达式(Regular expressions) A regular expression is a pattern containing both characters (like letters and digits) and metacharacters (like the * and $ symbols). Regular expressions can be used whenever we want to search, replace, or extract data with an identifiable pattern, for example, dates, posta

    2024年01月20日
    浏览(52)
  • Python Lambda表达式的底层原理详解:编译、执行与优化机制

    昨天面试被问到了lambda表达式的底层是怎么实现的,我直接脑子就空白了,因为平时只关注lambda的应用方式 在Python中,无论是普通函数还是Lambda函数,都会经过编译转换成字节码,解释器再执行这些字节码。 1.1 示例代码 通过 dis 模块,可以查看Lambda函数的字节码。这些字节

    2024年04月28日
    浏览(42)
  • 【正则表达式】正则表达式常见匹配模式

    模式 描述 w 匹配字母数字及下划线 W 匹配非字母数字下划线 s 匹配任意空白字符,等价于 [tnrf]. S 匹配任意非空字符 d 匹配任意数字,等价于 [0-9] D 匹配任意非数字 A 匹配字符串开始 Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 z 匹配字符串结

    2024年02月09日
    浏览(81)
  • 【SQL-正则】利用正则表达式进行过滤操作(常用正则表达式)

    1、由数字、26个英文字母或者下划线组成的字符串 2、非负整数(正整数 + 0 ) 3、正整数 4、非正整数(负整数 + 0) 5、负整数 6、整数 7、非负浮点数(正浮点数 + 0) 8、正浮点数 9、非正浮点数(负浮点数 + 0) 10、负浮点数 11、浮点数 12、由26个英文字母组成的字符串 13、

    2024年02月12日
    浏览(81)
  • Python正则表达式之学习正则表达式三步曲

            正则表达式描述了一种字符串匹配的模式,可以用来检查一个串的有无某子串,或者做子串匹配替换,取出子串等操作。也可以说正则表达式就是字符串的匹配规则,也可以理解为是一种模糊匹配,匹配满足正则条件的字符串。         1、数据验证(eg:表单验

    2024年02月15日
    浏览(66)
  • Java 之正则表达式语法及常用正则表达式汇总

    正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称

    2024年02月09日
    浏览(71)
  • 老夫的正则表达式大成了,桀桀桀桀!!!【Python 正则表达式笔记】

    特殊字符 .^$?+*{}[]()| 为特殊字符,若想要使用字面值,必须使用 进行转义 字符类 [] [] 匹配包含在方括号中的任何字符。它也可以指定范围,例: [a-zA-Z0-9] 表示a到z,A到Z,0到9之间的任何一个字符 [u4e00-u9fa5] 匹配 Unicode 中文 [^x00-xff] 匹配双字节字符(包括中文) 在 [] 中

    2024年02月04日
    浏览(60)
  • 机器学习与数据科学-专题1 Python正则表达式-【正则表达式入门-1】

    为了完成本关任务,你需要掌握: 在 Python 中使用正则表达式; 最基础正则表达式; 正则匹配函数。 在 Python 中使用正则表达式 正可谓人生苦短,我用 Python。Python 有个特点就是库非常多,自然拥有正则匹配这种常见的库,并且此库已经嵌入在 Python 标准库中,使用起来非常

    2024年01月22日
    浏览(64)
  • 正则表达式 (用于灵活匹配文本的表达式)

    目录 . * 用于匹配任意单个字符,除了换行符。 例如使用正则表达式 a.b, 它可以匹配aab、acb、a#b 用于匹配前一个字符零次或多次。 例如,使用正则表达式 ab*c ,它可以匹配 \\\"ac\\\"、\\\"abc\\\"、\\\"abbc\\\",因为 b* 表示匹配零个或多个字符 \\\"b\\\"。所以,这个表达式可以匹配 \\\"ac\\\"(零个 \\\"b\\\"),

    2024年01月16日
    浏览(63)
  • 利用正则表达式进行爬取数据以及正则表达式的一些使用方法

    Pattern:表示正则表达式 Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。 在大串中去找符合匹配规则的子串。 代码示例: 需求: 把连接:https://m.sengzan.com/jiaoyu/29104.html?ivk sa=1025883i中所有的身份证号码都爬取出来。 代码示例: 需求: 把下面文

    2024年02月09日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包