• 正则表达式(Java,C#,C++)


    课题

    1. 使用正则表达式匹配字符串
      使用正则表达式 "d{3}-(d{4})-d{2}" 匹配字符串 "123-4567-89"
      返回匹配结果:’"123-4567-89" 以及 "4567"
    2. 使用正则表达式替换字符串(模式)
      使用正则表达式 "(d+)-(d+)-(d+)" 匹配字符串 "123-4567-89"
      使用模式字符串 "$3-$1-$2" 替换匹配结果,返回结果 "89-123-4567"。
    3. 使用正则表达式替换字符串(回调)
      使用正则表达式 "d+" 匹配字符串 "123-4567-89"
      将匹配结果即三个数字串全部翻转过来,返回结果 "321-7654-98"。
    4. 使用正则表达式分割字符串
      使用正则表达式 "%(begin|next|end)%" 分割字符串"%begin%hello%next%world%end%"
      返回正则表达式分隔符之间的两个字符串 "hello" 和 "world"。

    Java

    import java.util.Arrays;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Test {
    
        public static void main(String[] args) {
            String s = "123-4567-89,987-6543-21";
            Pattern r = Pattern.compile("\d{3}-(\d{4})-\d{2}");
            Matcher m = r.matcher(s);
            for (int i = 0; m.find(); i++) {
                if (i == 0)
                    System.out.println("Found matches:");
                for (int j = 0; j <= m.groupCount(); j++)
                    System.out.printf("group %d,%d : %s
    ", i, j, m.group(j));
            }
     
            System.out.println(s.replaceFirst("(\d+)-(\d+)-(\d+)", "$3-$1-$2"));
     
            // https://stackoverflow.com/questions/19737653/what-is-the-equivalent-of-regex-replace-with-function-evaluation-in-java-7
            r = Pattern.compile("\d+");
            m = r.matcher(s);
            StringBuffer sb = new StringBuffer();
            while (m.find())
                m.appendReplacement(sb, new StringBuffer(m.group(0)).reverse().toString());
            m.appendTail(sb);
            System.out.println(sb.toString());
     
            r = Pattern.compile("%(begin|next|end)%");
            s = "%begin%hello%next%world%end%";
            System.out.println(Arrays.asList(r.split(s)));
        }
    }
     
    /*
    Found matches:
    group 0,0 : 123-4567-89
    group 0,1 : 4567
    group 1,0 : 987-6543-21
    group 1,1 : 6543
    89-123-4567,987-6543-21
    321-7654-98,789-3456-12
    [, hello, world]
    */
    

    C#

    using System;
    using System.Text.RegularExpressions;
     
    namespace Sample
    {
        class Test
        {
            public static void Main(string[] args)
            {
                var r = new Regex(@"d{3}-(d{4})-d{2}");
                var s = "123-4567-89,987-6543-21";
                {
                    var m = r.Match(s);
                    if (m.Success)
                        Console.WriteLine("Found matches:");
                }
                foreach (var (m, i) in r.Matches(s).Cast<Match>().Select((m, i) => (m, i)))
                    foreach (var (g, j) in m.Groups.Cast<Group>().Select((g, j) => (g, j)))
                        Console.WriteLine($"group {i},{j} : {g.Value}");
     
                r = new Regex(@"(d+)-(d+)-(d+)");
                Console.WriteLine(r.Replace(s, "$3-$1-$2"));
                
                r = new Regex(@"d+");
                s = r.Replace(s, m2 => {
                    var arr = m2.Groups[0].Value.ToCharArray();
                    Array.Reverse(arr);
                    return new string(arr);
                });
                Console.WriteLine(s);
     
                r = new Regex("%(?:begin|next|end)%");
                s = "%begin%hello%next%world%end%";
                Console.WriteLine(String.Join(",", r.Split(s)));
            }
        }
    }
     
    /*
    Found matches:
    group 0,0 : 123-4567-89
    group 0,1 : 4567
    group 1,0 : 987-6543-21
    group 1,1 : 6543
    89-123-4567,21-987-6543
    321-7654-98,789-3456-12
    ,hello,world,
    */
    

    C++

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boost/regex.hpp>
    #include <boost/algorithm/string.hpp>
    using namespace std;
    
    int main()
    {
        string s = "123-4567-89,987-6543-21";
        boost::regex r(R"(d{3}-(d{4})-d{2})");
        boost::match_results<string::const_iterator> mr;
        if (boost::regex_search(s, mr, r))
            cout << "Found matches:" << endl;
        int i = 0;
        for (boost::sregex_iterator begin(s.begin(), s.end(), r), end, it = begin; it != end; ++it, ++i)
            for (size_t j = 0; j < it->size(); ++j)
                cout << "group " << i << "," << j << " : " << (*it)[j] << endl;
         
        boost::regex r2(R"((d+)-(d+)-(d+))");
        cout << boost::regex_replace(s, r2, "$3-$1-$2") << endl;
         
        boost::regex r3(R"(d+)");
        s = boost::regex_replace(s, r3, [](auto& match) {
            string s = match.str();
            reverse(s.begin(), s.end());
            return s;
        });
        cout << s << endl;
         
        boost::regex r4("%(?:begin|next|end)%");
        s = "%begin%hello%next%world%end%";
        vector<string> v;
        for (boost::sregex_token_iterator begin(s.begin(), s.end(), r4, -1), end, i = begin; i != end; ++i)
            v.push_back(i->str());
        cout << boost::algorithm::join(v, ",") << endl;
    }
    
    /*
    Found matches:
    group 0,0 : 123-4567-89
    group 0,1 : 4567
    group 1,0 : 987-6543-21
    group 1,1 : 6543
    89-123-4567,21-987-6543
    321-7654-98,789-3456-12
    ,hello,world
    */
    
  • 相关阅读:
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    springboot 整合flowable 项目源码 mybiats vue.js 前后分离 跨域
    flowable Springboot vue.js 前后分离 跨域 有代码生成器 工作流
    Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    java 企业 网站源码 后台 springmvc SSM 前台 静态化 代码生成器
    java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目
    基于FPGA的电子计算器设计(中)
    基于FPGA的电子计算器设计(上)
    FPGA零基础学习:SPI 协议驱动设计
    Signal tap 逻辑分析仪使用教程
  • 原文地址:https://www.cnblogs.com/zwvista/p/7899250.html
Copyright © 2020-2023  润新知