zoukankan      html  css  js  c++  java
  • 正则表达式(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
    */
    
  • 相关阅读:
    第四节 哈希类型
    第三节 string类型
    第二节 redis的数据类型和一些通用的键命令
    第一节 Redis的安装配置
    第三十二节 定时器
    第三十一节 sed命令
    第三十节 awk命令
    第二十九节 cut命令
    第二十八节 函数和脚本调试
    Gartner 如何看 RASP 和 WAF?
  • 原文地址:https://www.cnblogs.com/zwvista/p/7899250.html
Copyright © 2011-2022 走看看