首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第七章 正则表达式编程

1.1 验证 验证是正则表达式最直接的应用,比如表单验证。 在说验证之前,先要说清楚匹配是什么概念。 所谓匹配,就是看目标字符串里是否有满足匹配的子串。因此,“匹配”的本质就是“查找”。...有 g,返回的是所有匹配的内容。 当没有匹配时,不管有无 g,都返回 null。 2.3 exec比match更强大 当正则没有 g时,使用 match返回的信息比较多。...因为它也能拿到该拿到的信息,然后可以假借替换之名,做些其他事情。 总体来说 replace有两种使用形式,这是因为它的第二个参数,可以是字符串,也可以是函数。...当第二个参数是字符串时,如下的字符有特殊的含义: $1, $2,..., $99匹配第1~99个分组里捕获的文本$& 匹配到的子串文本$``匹配到的子串的左边文本$' 匹配到的子串的右边文本$$` 美元符号...$'$&"); console.log(result); // => "2+3=2+3=5=5" 当第二个参数是函数时,我们需要注意该回调函数的参数具体是什么: "1234 2345 3456".replace

1.8K60

C#中的正则匹配和文本处理

第一个要研究的断言会导致正则表达式只能在字符串或行的开始处找到匹配. 这个断言由字符(^)产生....=regexp)断言对应的字符串作为匹配到的字符串结果, 前提是正向断言在正则表达式最右侧, 否则正向断言所匹配的字符串一样会包含在结果中) 下一个断言是负的正向断言....(与正向断言类似, 在正则表达式边缘的反向断言所匹配到的字符串不会作为匹配结果的一部分, 但是前提是处于正则表达式的最左侧) 现在我们再示范一个负反向断言, 它将要求一个处于任意非标点字符之间的’是’字之前不能是...9、CaptureCollection类 当正则表达式匹配子表达式的时候, 产生了一个被称为是Capture的对象, 而且会把此对 象添加到名为CaptureCollection的集合里面....通常情况下, 对Regex 类的方法增加代表正则设置的第三个参数就可以, 比如Match方法, Matches方法.

2.6K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JS正则表达式完整版

    没有回溯的匹配 假设我们的正则是/ab{1,3}c/,其可视化形式是: 而当目标字符串是”abbbc”时,就没有所谓的“回溯”。...从上面的描述过程中,可以看出,路走不通时,就会发生“回溯”。即,尝试匹配失败时,接下来的一步通常就是回溯。 道理,我们是懂了。那么JS中正则表达式会产生回溯的地方都有哪些呢?.../,会产生2次回溯(粉色表示.*?匹配的内容): 因为回溯的存在,需要引擎保存多种可能中未尝试过的状态,以便后续回溯时使用。注定要占用一定的内存。 此时要使用具体化的字符组,来代替通配符....当第二个参数是字符串时,如下的字符有特殊的含义: 1, 2,…, 99 匹配第1~99个分组里捕获的文本 & 匹配到的子串文本 ` 匹配到的子串的左边文本 ' 匹配到的子串的右边文本...&$'$&"); console.log(result); // => "2+3=2+3=5=5" 当第二个参数是函数时,我们需要注意该回调函数的参数具体是什么: "1234 2345 3456".

    3.1K40

    浅析ReDoS的原理与实践

    开发人员使用了正则表达式来对用户输入的数据进行有效性校验, 当编写校验的正则表达式存在缺陷或者不严谨时, 攻击者可以构造特殊的字符串来大量消耗服务器的系统资源,造成服务器的服务中断或停止。...1 常见术语 先让我们来了解几个概念: 1.1 Regex 正则表达式(Regular Expression, Regex)是由字符(可为英文字母、数字、符号等)与元字符(特殊符号)组成的一种有特定规则的特殊字符串...^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^ 也匹配 “\n” 或 “\r” 之后的位置。 $ 匹配输入字符串的结束位置。...同理字符串为aaaaaaaaaaX就要经历2^10=1024次尝试。如果我们继续增加a的个数为20个、30个或者更多,那么这里的匹配会变成指数增长。...当然为了避免这种威胁的最好手段是尽量减少正则在业务中的使用场景或者多做测试, 增加服务器的性能监控等。

    10.3K61

    Js中RegExp对象

    ,则会隐式地使用new RegExp(obj)将其转换为一个RegExp,传入的RegExp必须是设置了全局模式g的形式,否则会抛出异常TypeError,返回一个迭代器,不可重用,结果耗尽需要再次调用方法...](str) 对正则表达式匹配字符串时,[@@match]()方法用于获取匹配结果,这个方法的使用方式和String.prototype.match()相同,不同之处是this和参数顺序。...,这个方法的使用方式和String.prototype.matchAll()相同,不同之处是this和参数顺序。...,并返回替换后的新字符串结果,用来替换的参数可以是一个字符串或是一个针对每次匹配的回调函数,这个方法基本可以和String.prototype.replace()一样使用,不同之处是this和参数顺序。...()相同,不同之处是this和参数顺序。

    10.6K20

    Laravel源码笔记(二)路由

    我们在实际开发过程中,往往根据需求不同会隔离用户的使用场景,典型的例子就是CMS程序的管理端和用户端。...二、路由加载与规则解析         定义一条最基本的路由规则的语法很简单,调用Facade门面Route类的某个静态方法即可(本质上是调用了已经注册在服务容器中的路由器router实例api,不清楚...首先,拼接出的regex采用了子命名组语法,即(?P参数>表达式)的形式。这里是为了后面与请求url进行参数绑定的时候方便取出变量名和变量值。...将匹配得到的matches[1]子命名数组与路由本身的参数名数组parameterNames进行array_intersect_key()与array_filter(),得到形式为 array(’路由参数名...概括一下本次的收获:路由系统的核心,其实就是url这个特殊的字符串的处理,而其中的关键问题是如何同时处理字符串的匹配和参数提取。

    7.5K40

    Js中String对象

    ,当引用字符串在比较字符串前面时返回-1,当引用字符串在比较字符串后面时返回1,相同位置时返回0。...,则会隐式地使用new RegExp(obj)将其转换为一个RegExp,传入的RegExp必须是设置了全局模式g的形式,否则会抛出异常TypeError,返回一个迭代器,不可重用,结果耗尽需要再次调用方法...当使用一个regex时,必须设置全局g标志,否则将引发TypeError,即必须使用全局RegExp调用replaceAll。...strLength + beginIndex看待,这里的strLength是字符串的长度,endIndex可选,在该索引以0为基数处结束提取字符串,如果省略该参数,slice()会一直提取到字符串末尾,...,并根据判断结果返回true或false,参数searchString是要搜索的子字符串,参数position可选,在str中搜索searchString的开始位置,默认值为0。

    7.7K20

    正则表达式学习笔记

    g : 表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止; i : 表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写...字面量形式返回 1.2 RegExp 实例方法 pattern.exec(str) exec方法是RegExp的主要方法,主要用于提取捕获组(这个后面后讲到),它接收一个匹配字符串作为参数,如果匹配成功...在非全局模式匹配下,如果字符串中含有与模式匹配的多个子字符串,那么只会返回第一个匹配项的结果。...\x表示引用,引用的是具体的匹配字符串,也就是说上面例子中的\2引用的是第二个捕获组中的内容,其实应该对应的是”08”字符串,因此”20170808”当然与”20170809”字符串不匹配;反证可以看第四个匹配...,验证了上面的结果。

    1.4K40

    Java 正则表达式

    给你一个字符串(或文章),请你找出所有四个数字连在一起的子串,并且这四个数字要满足:第一位与第四位相同,第二位与第三位相同,比如1221 .5775 请验证输入的邮件,是否符合电子邮件格式....请验证输入的手机号,是否符合手机号格式 # 解决方法-正则表达式 为了解决上述问题,Java提供了正则表达式技术,专门用于处理类似文本问题 简单的说:正则表达式是对字符串执行模式匹配的技术。...),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2 平台的企业版),应" + "用 3443 于基于 Java 的应用服务器。...); } } } # 应用实例 # 对字符串进行如下验证 package com.regexp; import java.util.regex.Matcher; import...(\\d)(\\d)\\2\\1 思考题 请在字符串中检索商品编号.形式如:12321-333999111这样的号码,要求满足前面是一个五位数,然后一个-号,然后是一个九位数,连续的每三位要相同 package

    1.1K40

    正则的扩展

    # 正则的扩展 # RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况。 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)。...如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。...[1]); } return result; } 上面代码中,如果字符串里面没有非法字符,y修饰符与g修饰符的提取结果是一样的。...首先,后行断言的组匹配,与正常情况下结果是不一样的。 /(?...而“后行断言”时,由于执行顺序是从右到左,第二个括号是贪婪模式,第一个括号只能捕获一个字符,所以结果是1和053。 其次,“后行断言”的反斜杠引用,也与通常的顺序相反,必须放在对应的那个括号之前。

    98520

    Java中的正则表达式详解

    当创建Pattern对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写....该方法接受一个正则表达式作为它的第一个参数,比如:Pattern r= Pattern.compile(pattern); Matcher类 Matcher对象是对输入字符串进行解释和匹配的引擎。...请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个五位数,然后一个-号,然后是一个九位数,连续的每三位要相同 package com.hspedu.regexp...、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。...\nml 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 \un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。

    949120

    【译】ES10功能完全指南 - 还学的动吗?

    当所有浏览器开始支持它时,你已经获得了领先优势,这只是时间问题。对于有兴趣探索ES10的人来说,这是一份非外星人指南。...排名靠前的结果会建议你使用 String.match匹配的时候在正则表达式或者 RegExp.exc或者 RegExp.text后加上 /g... 首先,我们来看下旧的规范是如何运行的。...(注意: match匹配的结果存储在 matches[0]而非在 matches),在字符串 'hello'中搜索匹配 'l'只有 'l'被返回来。使用 regexp参数也是得到一样的结果。...在每次迭代调用 .exec时,会显示下一个结果(它不会立即返回所有匹配项)。...一个稳定的排序算法是当两个具有相等键的对象在排序输出中以与未排序输入中出现的顺序相同的顺序出现时。 但现在已经不是这样了。

    1.4K20

    一文带你读懂:Google 和 JDK 的正则表达式引擎有何不同

    ,能够正常去匹配字符串,但是在我们的系统中却抛出异常信息,如下: 不同引擎的使用差异 于是我这边进行问题定位,发现是底层使用了 Google 的 Re2j 的正则表达式引擎,代码段如下: public...,不同的表达式引擎,会出现不同的表现结果。...(如a|b)时,引擎将首先尝试匹配子模式a,如果结果不匹配,它将重置输入流并尝试匹配b。...该方法接受一个正则表达式作为它的第一个参数。 Matcher 类: Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。...当接受来自不受信任的源(如 web 应用程序的用户)的正则表达式模式时,这会产生安全风险。

    1.6K30

    正则表达式理论篇

    首先你要记住它的名字 正则表达式 regular expression 缩写 regexp 、regex 、egrep。 正则表达式可以干嘛 数据验证。 复杂的字符串搜寻、替换。...ES5在第一个参数是正则时,不允许此时使用第二个参数,会报错。 // 返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。 // 下面代码返回”i”。...返回:第一个与参数匹配的子串的起始位置,如果找不到,返回-1。 说明:不支持全局搜索,如果参数是字符串,会先通过RegExp构造函数转换成正则表达式。...参数:正则表达式或字符串。返回:子串组成的数组。 RegExp的方法 RegExpObject.exec() 参数:字符串。...\nml 当n 是八进制数字 (0-3),m 和 l 是八进制数字 (0-7) 时,匹配八进制转义码 nml。 修饰符 i 执行不区分大小写的匹配。

    1.2K20

    正则表达式入门 — 一个通过例子来说明的备忘单

    正则表达式(regex 或 regexp)在通过搜索特定搜索模式的一个或多个匹配(即 ASCII 或 unicode 字符的特定序列)从任何文本中提取信息时非常有用。...(https://regex101.com/r/cO8lqs/3) a[bc] 与上一条相同 字符类 — \d \w \s 以及 ....由几个组捕获的任何多次出现都将以经典数组的形式公开:我们将使用匹配结果的索引来访问它们的值。 如果我们选择为组添加名称(使用( ? ...))...: 数据验证 (比如检查一个时间字符串 i 的格式是正确的) 数据抓取(特别是网页抓取,最终按特定顺序查找包含特定单词集的所有页面) 数据转换(将数据从“原始”转换为另一种格式) 字符串解析(例如捕获所有...URL GET参数,捕获一组括号内的文本 字符串替换(即使在使用通用 IDE 的代码会话期间,例如在相应的 JSON 对象中转换 Java 或 C# 类 - 将“;”替换为“,”将其设为小写,避免类型声明等

    1.8K20

    正则表达式来了,Excel中的正则表达式匹配示例

    当需要在单元格区域中找到某个值时,可以使用MATCH函数。在单元格中查找特定字符串时,FIND函数和SEARCH函数非常方便。如何知道单元格中是否包含与给定模式匹配的信息?...如何使用正则表达式在Excel中匹配字符串 当所有要匹配的字符串都具有相同的模式时,正则表达式是理想的解决方案。...\b字符表示单词边界,意味着SKU是单独的单词,而不是较大字符串(如23-MAR-2022)的一部分。 建立了模式后,可以继续编写公式。实质上,使用自定义函数与内置函数没有什么不同。...正则表达式不匹配字符 若要查找不包含特定字符的字符串,可以使用与括号中以外的任何内容匹配的否定字符类[^]。例如: [^13]将匹配不是1或3的任何单个字符。...记住,任何国际代码都包含+号,可以使用[^\+]字符类查找不包含加号的字符串。重要的是要认识到,这个表达式匹配不是+的任何单个字符。

    22K30

    加强版正则表达式,邮箱,手机号防呆好用得不得了

    ([A-Za-z]{2,4})$" Regex = Createobject("NewXing.RegExp") ?...特点: 1、完全兼容VBScript.RegExp 正则组件的各种属性与方法 2、支持与 Perl 兼容的正则表达式语法。...一、NewXing.RegExp 对象 属性 描述 Global 是否全局匹配,默认值False,即只会匹配一次,如要匹配所有需将它的值设置为True IgnoreCase 匹配时是否忽略大小写,默认是区分大小的...默认情况下, ^ 符号只能匹配字符串开始位置, $ 符号只能匹配字符串结束位置。SINGLELINE 和 MULTILINE 虽然听起来相互矛盾,但却是作用在不同的地方。因此它们是可以组合使用的。...五、最后说一下NewXing.RegExp 对象的4个方法的相关参数与作用。

    98020

    资源 | 正则表达式的功法大全

    机器之心编译 正则表达式(regex 或 regexp)对于从文本中抽取信息极其有用,它一般会搜索匹配特定模式的语句,而这种模式及具体的 ASCII 序列或 Unicode 字符。...(https://regex101.com/r/cO8lqs/5) 使用「.」运算符需要非常小心,因为常见类或排除型字符类都要更快与精确。d、w 和s 同样有它们各自的排除型字符类,即D、W 和S。...:) 对于从字符串或数据中抽取信息非常重要,我们可以使用 Python 等不同的编程语言实现这一功能。从多个分组中捕获的多个匹配项将以经典的数组形式展示:我们可以使用匹配结果的索引访问它们的值。...Greedy 和 Lazy 匹配 数量符(* + {})是一种贪心运算符,所以它们会遍历给定的文本,并尽可能匹配。...* (https://regex101.com/r/cO8lqs/21) 结语 正如上文所示,正则表达式的应用领域非常广,很可能各位读者在开发的过程中已经遇到了它,下面是正则表达式常用的领域: 数据验证

    1.6K40

    js正则表达式(一)

    调用 RegExp 对象 r 的 test() 方法,并为它传递字符串 s,与这个表示式是等价的:(r.exec(s) != null)。 exec 返回一个数组,其中存放匹配的结果。...这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。...$’ 插入当前匹配的子串右边的内容 $n 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串 指定一个函数作为参数 指定一个函数作为第二个参数...p1,p2… 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的1,1,2等。) offset 匹配到的子字符串在原字符串中的偏移量。...(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是1) string 被匹配的原字符串。

    3.8K40
    领券