关于正则表达式 回溯过程的疑问

源串: The phrase "regular expression" is called "Regex" for short.
正则表达式 ".*"@
注意, 这里的引号也是正则表达式的一部分
麻烦说一下这个回溯过程 多谢
还有, 什么是优先匹配量词呢? 谢谢

回溯的过程大概是这样的,首先找到源串第一个",并把此位置标记,以便匹配失败时从此位置之后回溯。然后是正则.*,*指“匹配前面的子表达式零次或多次”,它是匹配优先的,就是可匹配也可不匹配时匹配。.*导致尝试一直匹配到结尾...short.,不成功尝试...short,再不成功尝试...shor,直到最后一个",匹配成功。追问

我主要想了解下 @的匹配和@匹配失败后的回溯过程 多谢

追答

不好意思看错了。
接着上面,.*尝试一直匹配到结尾,然后向前到最后一个", 这个"也会被标记,以便回溯。然后到@,发现不匹配,则从刚才标记的"向前再次找到一个",就是"Regex的R之前的",再次尝试匹配@,又不成功......这样直到第一个",此时.*实际上未匹配任何字符。然后再去匹配@,发现是r,匹配失败。因为这已经是第一个标记了,所以之前再也没有"了,所以本次匹配失败。然后从这个标记开始向后找",这就是" is中的",标记,继续......重复以上过程,总是失败直到再也找不到",整个串匹配失败。
貌似之前匹配hl的唯一行也是您的提问,那个问题中也给了一种可能的答案,可行的话希望结贴哈

追问

当控制权交给@的时候, @第一次匹配最后一个引号后面,失败, 控制权交给谁了呢, 是交给.*还是交给了刚刚标记的"呢 多谢 呵呵

追答

假设把正则放在类似栈结构中,现在栈顶是",匹配@不成功,则"出栈,再去读正则发现下个是",又发现有失败标记,则从标记往前再去匹配到一个","进栈,再去匹配@。
所以按照你的理解方式,“控制权”说交给.*比较合适

追问

你说的 "
则"出栈,再去读正则发现下个是",又发现有失败标记,则从标记往前再去匹配到一个","进栈,再去匹配@。

" 我不太理解 呵呵,
1,源串最后一个"出栈后, 下一个我觉得应该是匹配到的Regex中的x才对呀.
2, 从标记往前再去匹配到一个" 是什么意思呢? 是什么标记往左匹配呢?
3, "进栈是第几个引号进栈呢? 有点糊涂了 呵呵

追答

栈啊标记啊神马的都是具体实现中可能用到的方式,我这样的说法也只是一种可能的实现,因为要事无巨细的分析下去,只有拿到一个具体的环境中讨论,比如java实现,python实现。
为啥往标记的左侧匹配呢?取决于实现中对标记的逻辑定义和使用。
如果你是想从使用的角度分析下,个人觉得还是从总体上把握。如果要自己实现下,我感觉还是从编译原理状态机什么的入手。
功力有限,不过从你这个问题和之前那个hl,感觉这两个问题都值得答一答

温馨提示:内容为网友见解,仅供参考
无其他回答

php正则表达式
3.此时表达式执行到[0-9]{1,2},因为[0-9]{1,2}此时没有任何可以匹配的内容,所以引起回溯(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-201,[0-9]{1,2}与最后一位匹配成功得到字符串最后面的2,因为正则引擎的急切性,匹配成功后会立即用正则表达式剩余的部分继续向后匹配。4.此...

正则表达式 a(bc?)d 为什么能匹配acd
这是NFA引擎和DFA引擎不同导致的。NFA 采用的是“贪婪的”回溯算法,可以捕获子表达式匹配和匹配的反向引用;说白了就是 a(bc?)d 与a(cb?)d 一样的效果;当然能匹配acd

正则表达式之原理篇
回溯机制及常见的回溯形式 基础知识 1. 占有字符:正则表达式匹配过程中,如果子表达式匹配到东西,而并非是一个位置,并最终保存到匹配的结果当中 2. 零宽度:只匹配一个位置,或者是匹配的内容并不保存到匹配结果中 一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配 3.控制...

如何处理在使用正则表达式抓取数据是栈溢出问题
经查阅,是源自于正则表达式在匹配过程中的回溯次数过多,从而出现了堆栈溢出。因为在正则表达式的匹配过程中,需要不断地递归字符串,并根据你所写的正则表达式进行各种尝试与回溯。

ReDoS漏洞的原理、示例与应对
ReDoS漏洞的原理基于正则表达式在匹配字符串时的回溯过程。回溯是正则表达式在匹配失败后返回并重新尝试匹配的过程。例如,正则表达式“ab{1,3}c”在匹配字符串“ababbbcbbbccc”时,会经历多次回溯。为了防范ReDoS,可以通过控制回溯数量、限制正则表达式的复杂性、使用安全库或更换匹配引擎等方法。攻击示例中...

正则表达式匹配规则
匹配的过程如下:①当正则匹配不成功的时候,就会尝试进行回溯 ②回溯成功与否取决于是否有可回溯的位置 ③若没有会回溯位置,则整个正则表达式匹配失败,控制权交还给表达式的起始位置 ④正则规则中使用量词修饰,或者使用|的时候,所匹配的位置为可回溯位置 依旧是一个简单的例子 依旧对正则进行拆解,拆解...

关于正则表达式及pcre的介绍
使用PCRE时,需遵循以下步骤:明确需求、使用简单表达式、控制贪婪性、使用字符类、预编译正则表达式、使用锚点、避免回溯、测试和优化、学习正则表达式引擎的工作原理。不当使用正则表达式可能导致性能下降、逻辑错误、系统崩溃等问题。Cloudflare因不当正则表达式导致的全球范围故障就是一个著名案例。在2019年7月...

regexbuddy正则表达式测试工具使用方法
从上面过程中,我们发现,每次回溯,要重新操作匹配因此匹配搜索次数,直接影响正则表达式的性能。做正则表达式性能优化,一般就是优化查询的次数。这个是我们分析过程,如果有个工具能够实实在在看到每一步匹配过程,对于我们优化正则表达式将带来太多方便了。这里介绍工具是:regexbuddy软件,它就是一个实实在...

如何从零写一个正则表达式引擎?
3. **回溯支持**:是否实现回溯功能?对于需要支持回溯的正则表达式,直接使用线性化NFA和字节码虚拟机可能更合适。4. **JIT引擎**:是否要实现即时编译(JIT)引擎?这将提供更高的性能,但实现难度较高,可以参考相关项目。5. **POSIX标准兼容性**:是否需要兼容POSIX标准中的正则部分?这可能需要...

正则表达式高级用法
上面的问题就可以使用正则表达式 (the|you){3} 来表示 当一个模式的全部或者部分内容由 一对括号括起来 时,就对表达式进行了分组(其实就是放在 () 中的子表达式),并且把分组匹配到内容捕获并且临时存放在内存中。这就是捕获分组,可以在后面表达式中使用就叫后向引用,或者叫回溯引用。 默认...

相似回答
大家正在搜