zoukankan      html  css  js  c++  java
  • 正则表达式入门(1)

    示例用的是C#

    VS 控制台引用程序

    1.准备工作

    (1) 先在项目根下创建目录examples统一存放示例文本文件

    (2) 创建一个读取文本文件内容的方法,方便获取文件内容,代码如下

    static string ReadFile(string name)
    {
        string path;
    
        //拼接文件路径
        path = string.Concat(
            Environment.CurrentDirectory,
            "\examples\",
            name,
            ".txt"
        );
    
        //返回文件内容,默认文件编码,和系统一致,就不再指定了
        return File.ReadAllText(path);
    }

    2.示例1

    先在examples目录下创建第一个示例文本文件 example1.txt

    为了要在生成的时候一起把文件复制过去,需要把文件的属性"复制到输出目录"选项改成"如果较新则复制",默认是"不复制"

    在文件输入1-15的数字和a-f的字符,每行一个,内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    a
    b
    c
    d
    e
    f

    第一个示例方法,简单的匹配每行的数字,代码如下

    static void example1()
    {
    string content;
    string expression;
    Regex regex; MatchCollection matches; expression
    = "^[0-9]"; //读取文件内容 content = ReadFile("example1"); regex = new Regex(expression, RegexOptions.Multiline); //Matches找到所有匹配 matches = regex.Matches(content); //显示所有匹配文本的内容 foreach (Match match in matches) { Console.WriteLine(string.Concat("'", match.Value, "'")); } }

    表达式比较简单,由"^"和"[0-9]"组成

    "^" 不会匹配任何字符,表示的是任意一行的开始,表示行尾的是"$"

    "[0-9]","["和"]"表示的是一个字符分组,中间的"0-9"表示的是0到9所组成的数字,当然还可以用"[0123456789]","0-9"中用"-"来表示一个范围,如果不想匹配数字"5",那可以用"[012346789]"或者简"[0-46-9]"

    "^[0-9]"还有一个等效的表达式,"^\d",因为字符串本身有转义,所以是2个"",正则表达式本身是"^d",d表示一个十进制数字

    这个表达式匹配的是放在任意一行第一个位置的数字,如果行的第一个字符不是数字,则不会匹配

    有一点需要注意的是 RegexOptions 枚举,如果指定的是RegexOptions.Singleline,则会忽略所有换行,"^"只能匹配到字符串的头,下面的每行的开头都不会被匹配到。

    本例需要的是匹配的是每一行,所以指定了RegexOptions.Multiline

    执行后显示的结果是

    '1'
    '2'
    '3'
    '4'
    '5'
    '6'
    '7'
    '8'
    '9'
    '1'
    '1'
    '1'
    '1'
    '1'
    '1'

    因为只匹配了一个字符

    如果想要1-15都匹配,可以这样

    "^\d*"或者"^\d+"或者"^\d{1,2}"

    "^\d*" 后面的 "*" 表示的是可以匹配0个或者多个,因为允许0个匹配,所以下面a-f所在的行也可以匹配到,只是匹配的到结果是空字符串

    显示结果如下

    '1'
    '2'
    '3'
    '4'
    '5'
    '6'
    '7'
    '8'
    '9'
    '10'
    '11'
    '12'
    '13'
    '14'
    '15'
    ''
    ''
    ''
    ''
    ''
    ''

    好像不太符合要求

    "^\d+"就比较符合要求了,+表示1个或多个匹配,至少需要有1个匹配

    结果如下

    '1'
    '2'
    '3'
    '4'
    '5'
    '6'
    '7'
    '8'
    '9'
    '10'
    '11'
    '12'
    '13'
    '14'
    '15'

    这样就对了

    "*"和"+"都是属于量词(quantifiers),用来限制前面的元素所匹配的次数

    "*" 表示 0个或多个(任意个)

    "+" 表示 1个或多个(至少有1个)

    "?" 表示 0个或1个(有或者没有)

    当然还有这种形式

    "^\d{1,2}"

    {1,2}表示的是一个区间(interval quantifier),也是用来限制匹配次数的 形式是 {min, max}

    其中max必须大于等于min

    区间比较灵活,比如上面的 忽略个位数(至少要有2次匹配) 可以写成"^\d{2,}",100以下的可以这么写"^\d{1,2}",

    在min和max相同时可以只写一个,比如只要个位数,那只要写"^\d{1}"

    "{0,}"效果等同于"*"

    "{1,}"效果等同于"+"

    "{0,1}"效果等同于"?"

    如果要限制只匹配纯数字的行,可以用"^\d+$"

    数字或者字母可以这样"^[\dA-Za-z]+"

  • 相关阅读:
    ActiveMQ 默认用户名和密码
    # ActiveMQ连接超时问题(java.net.SocketException: Connection reset)
    SpringBoot(十) Logback 配置详解
    postgresql10以上的自动分区分表功能
    基于Redis实现延时队列服务
    Redis(十三):Redis分布式锁的正确实现方式
    Redis(十七):批量操作Pipeline
    Redis(十八):Redis和队列
    PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句
    PostgreSQL 从文件时间戳获悉一些信息(如数据库创建时间)
  • 原文地址:https://www.cnblogs.com/afox/p/3524748.html
Copyright © 2011-2022 走看看