正则表达式与或非(如何查找目录下包含某个字符串的所有文件)

:暂无数据 2026-04-08 05:00:01 0
关于正则表达式与或非,有一个概念至关重要,那就是如何查找目录下包含某个字符串的所有文件。它为何如此重要?且听我们慢慢道来。

本文目录

如何查找目录下包含某个字符串的所有文件

文本器工具,比如sublime  进去ctrl+shift+f 整个目录搜索 ,

左侧是你的当前目录内的所有文件,*.*表示所有文件名的所有格式你也可以是设置比如查找txt文件 

流程:

查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名find.|xargs grep-ri"IBM"-l

1.正则表达式

(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。(2)基本元字符集及其含义

只匹配行首。如^a 匹配以a开头的行abc,a2e,a12,aaa,.

只匹配行尾。如^a 匹配以a结尾的行bca,12a,aaa,.

匹配0个或多个此单字符。如(a)*匹配 空,a,aa,aaa,.

\:只用来屏蔽一个元字符的特殊含义。如\*,\’,\",\|\+,\^,\.等

(点)只匹配任意单字符。pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa.pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,.pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个

(3)举例说明:

匹配空行

希望能帮到大家

正则的非是什么

正则表达式的与或非
我们使用正则表达式,熟练掌握各种功能和结构只是手段,解决实际的问题才是真正的目的。要解决真正的问题,就必须有解决问题的思路,正则表达式的功能,说到底,可以归纳为三种逻辑,为了表述方便,我们分别称为与、或、非。
***隐藏网址***

正则表达式“或“怎么写

竖线“|”就是或的意思。意思是将两个匹配条件进行逻辑“或”(or)运算。

例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。

而最简单的元字符是点,它能够匹配任何单个字符(注意不包括换行符)。

扩展资料:

求值运算:

进行逻辑表达式求值运算,不但要注意逻辑运算符本身的运算规则,而且还必须要遵循下面的两条原则:

1、对逻辑表达式从左到右进行求解。

2、短路原则:在逻辑表达式的求解过程中,任何时候只要逻辑表达式的值已经可以确定,则求解过程不再进行,求解结束。

具体理解逻辑表达式运算规则时可以先找到表达式中优先级最低的逻辑运算符,以这些运算符为准将整个逻辑表达式分为几个计算部分。

从最左边一个计算部分开始,按照算术运算、关系运算和逻辑运算的规则计算该部分的值。每计算完一个部分就与该部分右边紧靠着的逻辑运算符根据真值表进行逻辑值判断。

如果已经能够判断出整个逻辑表达式的值则停止其后的所有计算;只有当整个逻辑表达式的值还不能确定的情况下才进行下一个计算部分的计算。

正则表达式的基本规则

正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语言基本上都有正则表达式,如JavaScript、java等。
其实,只要了解一种语言的正则使用,其他语言的正则使用起来,也就完全没有什么问题了。下面,我们就来讲讲正则表达式的一些基本规则。

一、起始与结束定位符(^与$)

起始与结束定位符是用来描述字符串的开始与结尾。如:"^"表示行匹配的字符串的开始,"$"表示字符串的结尾,如:/^aaa(.*?)bbb$/,表示一个要匹配的字符串是以aaa开始的,bbb结尾的,中间可以穿插任意字符串。

二、选择字符"|"

选择字符表示或的意思。如(my|your)baby,mybaby与yourbaby都可以匹配到。

三、万能匹配符.

"."在正则表达式中代表任意字符,但是只代表一个。

四、数量匹配运算符"+","*","?"

"*"代表0或多次,"+"代表1或多次,"?"代表0或1次。

五、贪婪模式与非贪婪模式

前面说过?是0个或1个的意思。如果您正则表达式是用于字符串替换的,那么贪婪模式就是所有匹配的都替换,非贪婪模式就是只替换第一个。通常在一个表达式后添加?就是非贪婪模式,

综合实例,如何将一个网址news.html,news-page-1.html,news-page-2.html,news-page-3.html用一个正则表达式都匹配起来。

答:/^news(.*?)\.html$/

谁教下我正则啊,与或非与括号这点事@@@@@@@@@@@@@@@@

1:js与php asp啥的,正则差别大吗
不大只是调用的方式不一样
2:正则里怎么有大小中括号各是什么意思,能讲个例子最好
括号是分组取值的意思
如(\d+)
((\S\d)+) ghrtyrta1b2c3 会取得a1b2c3这组的值
3:如何排除一个串,帮我写这个小例子,$str = "this is a test888,test999,test123"
test后面是三个数字,但不能是123如何写?取出来结果就行,这是与或非概念吗&|^
this is a ((?:test(?!123)\d+,?)+) 这是匹配出 test888,test999,test222 的字符串 如果test中有123就匹配不成功了
(test(?!123)\d+) 这是匹配出 test888这类型的如果test后面有123就不能匹配
&---- 正则中这个字符只是普通字符没含义的
|---- 正则中这个是含义表示"或"
^---- 正则中这个表示“非”

正则表达式之原理篇

背景

       最近公司规范出来后,关于字符串不提倡用 “ + ”  进行拼接,于是自己写了个function,利用正则表达式来进行匹配。对于正则表达式,之前不了解原理,每次要用的时候查一下,很浪费时间。

内容

基础知识;

正则表达式引擎;

贪婪与非贪婪模式;

DFA与NFA引擎;

回溯机制及常见的回溯形式

基础知识

1. 占有字符:正则表达式匹配过程中,如果子表达式匹配到东西,而并非是一个位置,并最终保存到匹配的结果当中

2. 零宽度:只匹配一个位置,或者是匹配的内容并不保存到匹配结果中

一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配

3.控制权:正则表达式由左到右依次进行匹配,通常情况下是由一个表达式取得控制权,从字符串的的某个位置进行匹配,一个子表达式开始尝试匹配的位置,是从前一子表达匹配成功的结束位置开始的(例如:(表达式一)(表达式二)意思就是表达式一匹配完成后才能匹配表达式二,而匹配表达式二的位置是从表达式一的位置匹配结束后的位置开始)。如果表达式一是零宽度,那表达式一匹配完成后,表达式二匹配的位置还是原来表达式以匹配的位置。也就是说它匹配开始和结束的位置是同一个

4. 元字符 

5. 反义元字符

6. 转义字符:\  使元字符失去它的意义,仅代表其输入中字符的意义

需要转义的字符列表 \ * + ? | { [ ( ) ^ $ . # 和 空白

7. 重复限定符:匹配优先量词,忽略优先量词,即:贪婪与非贪婪

{n,}、 {n, m}、 {, m}、 ’+’ 、‘?’、 ’*’

8. 字符类:,区分大小写

9. 分支条件: |

10. 分组 :()指定子表达式,可限制多选项的范围、将若干字符组合为一个单元、受问号或星号之类的量词作用,例:(\d{1,3}){3}\d{3}

断言;(?

11. 括号及反向引用:(子表达式一)(子表达式二)\1      此时括号作用为分组,它具有记忆的功能,即在正则表达式内部仍然能回忆上次匹配到的是什么;\1、\2、\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1、$2、$n 这样的语法

12. 平衡组 参考

正则表达式引擎

有两个主要特点:

1. 默认贪婪匹配;( 贪婪匹配与非贪婪匹配 )

2. 返回最先匹配到的结果

针对简单的正则匹配进行分析,例:

        当把cat应用到“He captured a catfish for his cat”,引擎先比较c和“H”,结果失败了。于是引擎再比较c和“e”,也失败了。直到第四个字符,c匹配了“c”。a匹配了第五个字符。到第六个字符t没能匹配“p”,也失败了。引擎再继续从第五个字符重新检查匹配性。直到第十五个字符开始,cat匹配上了“catfish”中的“cat”,正则表达式引擎急切的返回第一个匹配的结果,而不会再继续查找是否有其他更好的匹配

Rubular: 基于 Web 的 Ruby 正则表达式器

贪婪与非贪婪(又称惰性、懒惰等)模式

两者影响的是被量词修饰的子表达式的行为。

贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配;而非贪婪模式(只被部分NFA引擎支持)在整个表达式匹配成功的前提下,尽可能少的匹配。

匹配优先量词(属于贪婪模式的量词):

“{m,n}”、“{m,}”、“?”、“*”和“+”。

忽略优先量词(匹配优先量词后加上“?”:非贪婪模式的量词):

“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”

例:

源字符串:aa
正则表达式一:
正则表达式二:
DFA与NFA引擎(JS的正则引擎是NFA:非确定型有限自动机)

参考: 正则表达式引擎及其分类

DFA引擎:在线性时状态下执行,不要求回溯(因此永远不测试相同的字符两次);确保匹配最长的可能的字符串;因为只包含有限的状态(?),所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式

传统的NFA引擎:运行匹配回溯算法——以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。因为传统的 NFA 构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。但传统 NFA的 回溯使它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。因为传统的 NFA 接受它找到的第一个匹配,所以它还可能会导致其他(可能更长)匹配未被发现

POSIX NFA 引擎:与传统 NFA 引擎类似,不同点:在可以确保已找到了可能的最长的匹配之前,它们将继续回溯(更慢);并且在使用 POSIX NFA 时,您恐怕不会愿意在更改回溯搜索的顺序的情况下来支持较短的匹配搜索,而非较长的匹配搜索

例:

字符串: this is yansen’s dog

正则表达式: /ya(msen|nsen|nsem)/

NFA工作方式:先在字符串中查找 y, 然后匹配其后是否为 a;  如果是 a 则继续查找其后是否为 m; 如果不是则匹配其后是否为 n (此时淘汰 msen 支分支); 然后继续看其后是否依次为 s,e; 接着测试是否为 n ,是 n 则匹配成功,不是则测试是否为 m 。为什么是 m ?因为 NFA 工作方式是以正则表达式为标准,反复测试字符串,这样同样一个字符串有可能被反复测试了很多次!

DFA:从 this 中 t 开始依次查找 y ,定位到 y ,已知其后为 a ,则查看表达式是否有 a ,此处正好有 a; 然后字符串 a 后为 n ,DFA依次测试表达式,此时 msen 不符合要求淘汰。 nsen 和 nsem 符合要求,然后DFA依次检查字符串,检测到 sen 中的 n 时只有 nsen 分支符合,则匹配成功!

由此两种引擎是完全不同的工作方式:NFA以表达式为主导,更容易操纵;DFA以文本为主导(搜索更快)

回溯机制

引擎是如何来处理那些模糊的条件匹配?

从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”

--来自百度百科

本质上就是深度优先搜索算法:尝试匹配失败时的下一步通常就是回溯

JS中正则表达式会产生回溯的地方都有哪些呢?

常见的回溯形式

1.贪婪量词

例:正则:/ab{1,3}c/

可视化形式

1. 没有回溯的匹配:当目标字符串是"abbbc"时

匹配过程

2. 有回溯的匹配:当目标字符串是“abbc”时

匹配过程

上图第5步有红颜色(仅表示匹配不成功):此时b{1,3}已经匹配到了2个字符“b”,准备尝试第三个时,结果发现接下来的字符是“c”。那么就认为b{1,3}就已经匹配完毕。然后状态又回到之前的状态(即第6步,与第4步一样),最后再用子表达式c,去匹配字符“c”。当然,此时整个表达式匹配成功了;上图的第6步,就是“回溯”

即:尝试可能的顺序是“从多往少”的方向去尝试:首先会尝试"bbb",然后再看整个正则是否能匹配。不能匹配时,吐出一个"b",即在"bb"的基础上,再继续尝试。如果还不行,再吐出一个,再试。如果还不行呢?只能说明匹配失败了

另一个清晰的回溯:

正则:/".*"/

目标字符串:"acd"ef

省略了尝试匹配双引号失败的匹配过程

其实“.*”最简单但也是非常影响效率的

2.惰性量词

虽然惰性量词不贪,但也会有回溯的现象(为了整体匹配成)

正则表达式

目标字符串:"12345"

匹配过程

3.分支结构

分支也是惰性的,比如/Java|JavaScript/,去匹配字符串"JavaScript",得到的结果是"Java",因为分支会一个一个尝试,如果前面的满足了,后面就不会再试验了。

分支结构中可能前面的子模式会形成了局部匹配,如果接下来表达式整体不匹配时,仍会继续尝试剩下的分支。这种尝试也可以看成一种回溯:

正则表达式

匹配过程

虽然第五步没有回到之前的状态,但仍然回到了分支结构,尝试下一种可能

总结:有回溯的过程,那么匹配效率肯定比DFA相对低一些;别看匹配慢,但是编译快而且还挺有趣

参考: 正则表达式的回溯机制

正则表达式横杠的含义

是匹配非换行符与结束符之外的字符的意思。
写在一起就是匹配横杠或非换行符和结束符之外的字符的意思。
正则表达式,又称规则表达式。(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

正则表达式方法

正则表达式: 使用单个字符串来描述、匹配一系列·符合·某个句法规则的字符串搜索模式。
语法: /正则表达式主体/修饰符
修饰符: i表示执行对大小写不敏感的匹配。g表示执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。m表示执行多行匹配。

1.search()方法,用于检索指定字符串的子字符串,并返回子字符串的起始位置。
    语法:str.search(regexp);
     例如: 使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:

2.replace()方法,用在字符串中的一些字符替换另一些字符,或替换与正则表达式匹配的字符串。
    语法:str.replace(regexp);
     例如: 使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :

3.match()方法,可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,并以数组形式返回匹配结果。
    语法:str.match(regexp);
     例如: 使用正则表达式且不区分大小写将全文字符串中的here查找出来 :

4.split()方法,用于把一个字符串分割成字符串数组。
    语法:str.split(separator,limit);  separator为字符串或正则表达式,limit指定返回数组的最大长度。
     例如:

RegExp对象是一个预定义了属性和方法的正则表达式对象。
语法:var patt = new RegExp(pattern,modifiers); 或 var patt = /pattern/modifiers;
      pttern为表达式,modifiers为修饰符用于指定全局匹配g,区分大小写i,和多行比配m。

1.test()方法,用于检测字符是否匹配某个模式,有则返回true,否则返回false。
    语法:patt.test(str)
     例如: 搜索字符串中的字符 "e":

2****c()方法,用于检索字符串中是否有正则表达式的匹配值,有则返回匹配值,否则返回null。
    语法:patt****c(str)
     例如:

3.compile()方法,用于在脚本执行过程中编译正则表达式,也可用于改变和重新编译正则表达式。
    语法:patt.compile(regexp,modifier)
     例如:

例题
1.给定字符串 str,检查其是否符合如下格式:XXX-XXX-XXXX,其中 X 为 Number 类型。
   解析 :开头^和结尾$必须加上来限定字符串,3个数可表示为\d{3},4个数则为\d{4},{n}表示前面内容出现的次数。

2.给定字符串 str,检查其是否包含 连续3个数字 ,如果包含,返回最新出现的 3 个数字的字符串,如果不包含,返回 false。
   解析 :match()返回的是正则表达式匹配的字符串数组,连续的三个任意数字用正则表达式表示为/\d{3}/。

3.给定字符串 str,检查其是否符合美元书写格式:以 $ 开始;整数部分,从个位起,满 3 个数字用 , 分隔;如果为小数,则小数部分长度为2;正确的格式如:$1,023,032.03 或者 $2.03,错误的格式如:$3,432,12.12 或者 $34,344.3。
   解析 :开头必是 表示结尾,需要进行转义,因此开头为^$;
        然后dollar符后必然接数字,并且最少一位,最多三位数,可用{m,n}表示,最少m位,最多n位,因此此段为\d{1,3};
        接着,后面如还有数,则必然有,分隔,并且后面必有3个数,类似于,XXX的格式会出现0或者n次,因此此段可表示为(,\d{3})*;
        最后,如有小数部分,则注意对小数点进行转义,此段可表示为(.\d{2})?;
        使用test方法去检测str

至此,正则表达式与或非如何查找目录下包含某个字符串的所有文件的主题暂告一段落。但学习和思考永无止境。关于这个话题,你是否有独特的案例或反向观点?欢迎撰文投稿或评论区激烈讨论!
本文编辑:admin

更多文章:


正则匹配整数(正则匹配大于0的整数或空)

正则匹配整数(正则匹配大于0的整数或空)

大家好,如果您还对正则匹配整数不太了解,没有关系,今天就由本站为大家分享正则匹配整数的知识,包括正则匹配大于0的整数或空的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年4月8日 05:40

w3school数据库(如何制作查分数据库)

w3school数据库(如何制作查分数据库)

本文将围绕w3school数据库展开,重点探讨三个方面:如何制作查分数据库的基本概念、常见误区以及实践应用。让我们开始吧。

2026年4月8日 05:20

正则表达式与或非(如何查找目录下包含某个字符串的所有文件)

正则表达式与或非(如何查找目录下包含某个字符串的所有文件)

关于正则表达式与或非,有一个概念至关重要,那就是如何查找目录下包含某个字符串的所有文件。它为何如此重要?且听我们慢慢道来。

2026年4月8日 05:00

模板网站定制(定制网站和模版网站有哪些区别)

模板网站定制(定制网站和模版网站有哪些区别)

嗨,正在屏幕前搜索模板网站定制的你,是否也被定制网站和模版网站有哪些区别的问题困扰过?今天这篇内容就是为你准备的。

2026年4月8日 04:40

后端程序员需要学什么(后端工程师是做什么的)

后端程序员需要学什么(后端工程师是做什么的)

关于后端程序员需要学什么,有一个概念至关重要,那就是后端工程师是做什么的。它为何如此重要?且听我们慢慢道来。

2026年4月8日 04:20

python的优点有哪些(学python的好处)

python的优点有哪些(学python的好处)

想快速搞懂python的优点有哪些吗?本文将围绕学python的好处等核心问题,用最直白的语言为您提供一份实用指南,帮您节省大量摸索的时间。

2026年4月8日 04:00

match怎么读(match怎么读)

match怎么读(match怎么读)

嗨,正在屏幕前搜索match怎么读的你,是否也被match怎么读的问题困扰过?今天这篇内容就是为你准备的。

2026年4月8日 03:40

chmod文件夹下所有文件(linux快速修改文件夹及文件下所有文件与文件夹权限)

chmod文件夹下所有文件(linux快速修改文件夹及文件下所有文件与文件夹权限)

本文旨在为您说清楚两件事:一是chmod文件夹下所有文件到底是什么,二是如何理解linux快速修改文件夹及文件下所有文件与文件夹权限。内容不长,但都是干货,希望能对您有所帮助。

2026年4月8日 03:20

玳瑁手镯千万不能随便戴(玳瑁手镯的功效与作用女性戴玳瑁手镯好吗)

玳瑁手镯千万不能随便戴(玳瑁手镯的功效与作用女性戴玳瑁手镯好吗)

常言道:“万丈高楼平地起”。理解玳瑁手镯千万不能随便戴这座大厦,也必须从玳瑁手镯的功效与作用女性戴玳瑁手镯好吗这块基石开始。

2026年4月8日 03:00

cmake编译安装(Mac平台 使用CMake编译iOS lib)

cmake编译安装(Mac平台 使用CMake编译iOS lib)

在深入了解cmake编译安装的路上,Mac平台 使用CMake编译iOS lib就像一道绕不开的坎。别担心,本篇攻略将助你轻松跨越。

2026年4月8日 02:40

最近更新

python的优点有哪些(学python的好处)
2026-04-08 04:00:01 浏览:0
match怎么读(match怎么读)
2026-04-08 03:40:02 浏览:0
热门文章

***ubmit是网页中的事件吗([php]onSubmit和onclick区别)
2026-04-06 17:40:01 浏览:0
vuex模块化(为用户配置后台时)
2026-04-06 12:20:02 浏览:0
shadows什么意思(who says i am alone,see,my shadow is not always with me是什么意思)
2026-04-06 07:00:02 浏览:0
标签列表