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]+"

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/afox/p/3524748.html
Copyright © 2011-2022 走看看