【Linux 基础】正则表达式 与 通配符 区别

简短不看版:

通配符和正则表达式比较

(1)通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。

(2)*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个字符,不能独立使用的。比如通配符可以用*来匹配任意字符,而正则表达式中的"*"不行,他只匹配任意长度的前面的字符(如果想匹配任意字符,那么就需要用.符号,通配符中的  * = 正则表达式中的.*

(3)使用场景:通配符 是文件名。正则表达式 文本内容

(4) 使用命令 通配符 find rm ls cp  由shell解析; 正则表达式 vi grep sed awk

零、正则表达式相关网站

1. 编程胶囊:https://codejiaonang.com/#/

2. B站up主CodeSheep正则表达式归纳:https://r2coding.com/#/README?id=正则表达式

尤其推荐里面的正则表达式可视化工具。

 

一、通配符介绍

1、1:Shell常见通配符:

通配符

含义

实例

*

匹配 0 或多个字符

a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。

?

匹配任意一个字符

a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。

[list]

匹配 list 中的任意单一字符

a[xyz]b  a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。

[!list]或[^list]

匹配 除list 中的任意单一字符

a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。

[c1-c2]

匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]

a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。

[!c1-c2]或[^c1-c2]

匹配不在c1-c2的任意字符

a[!0-9]b 如acb adb

{string1,string2,...}

匹配 sring1 或 string2 (或更多)其一字符串

a{abc,xyz,123}b 列出aabcb,axyzb,a123b

1、2 shell Meta字符(元字符)

shell 除了有通配符之外,还有一系列自己的其他特殊字符。

字符

说明

IFS

由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )

CR

由 <enter> 产生

=

设定变量

$

取变量值或取运算值

重定向 stdout

重定向 stdin

|

管道符号

&

重导向 file descriptor ,或将命令置于背景执行

( )

将其内的命令置于 nested subshell 执行,或用于运算或命令替换

{ }

将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围

;

在前一个命令结束时,而忽略其返回值,继续执行下一个命令

&&

在前一个命令结束时,若返回值为 true,继续执行下一个命令

||

在前一个命令结束时,若返回值为 false,继续执行下一个命令

!

运算意义上的非(not)的意思

#

注释,常用在脚本中

\

转移字符,去除其后紧跟的元字符或通配符的特殊意义

 

1、3 转义字符

有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。

字符

说明

‘’(单引号)

硬转义,其内部所有的shell 元字符、通配符都会被关掉。

“”(双引号)

软转义,其内部只允许出现特定的shell 元字符:$用于参数替换 `(反单引号,esc键下面)用于命令替换

\(反斜杠)

又叫转义,去除其后紧跟的元字符或通配符的特殊意义

 

二、正则表达式

正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具里,大都用到正则表达式,如vi,grep,awk,sed等。

另外,这篇文章只针对Linux下的文本过滤工具的正则表达式进行讨论,其他的一些编程语言,如C++(c regex,c++ regex,boost regex),java,python等都有自己的正则表达式库。

简单点来说,正则表达式是对一组正在处理的文本的描述。

转载自:https://www.cnblogs.com/rebrobot/p/15929285.html

 

扩展:牛客华为正则表达式例题

题目:

IPV4地址可以用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此正号不需要出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。

现在需要你用程序来判断IP是否合法。

 参考答案:(C++)

#include<iostream>
#include<string>
#include<regex>  //注意:使用正则表达式库
using namespace std;
 
int main(){
    string ip;
    
    //初始化一个 regex 对象。
    regex pattern("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\.){4}");//匹配0.0.0.0.-255.255.255.255.的正则表达式
    //regex pattern(R"(((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d).){4})"); //或者使用不转义的字符串
    while(getline(cin, ip)){
        ip += "."; //正则表达式匹配的四个点,ip地址后面再加一个
        if(regex_match(ip, pattern)) //匹配函数  使用方法:regex_match(字符串,regex对象)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

另外,C++可以使用R"()"令字符串中的内容不进行转义,如下所示。

例如string str=R"(//str\n//)";, cout 输出结果为//str\n//

 

 

posted @ 2023-12-03 15:42  FBshark  阅读(159)  评论(0编辑  收藏  举报