Regex, group & quantifyer
Regex, group & quantifyer
我刚刚在http://regexcrossword.com/-发现我不理解量化组的含义,例如(.)+或(.)*
让我试试http://ole.michelsen.dk/tools/regex.html,它提供JavaScript和PHP正则表达式引擎:
要匹配的字符串是"Trololo!"(没有引号)。(如果打开"全局匹配"改变了什么,它会被添加为预处理版本,即JS,因为它在PHP模式下没有改变任何东西。)
JS, (.)+ => 0: Trololo! 1: !
JS', (.)+ => 0: Trololo!
PHP, (.)+ => 0: Trololo! 0: !
JS, (.)* => 0: Trololo! 1: !
JS', (.)* => 0: Trololo!
PHP, (.)* => 0: Trololo! 1: 0: ! 1:
JS, (.){5} => 0: Trolo 1: o
JS', (.){5} => 0: Trolo
PHP, (.){5} => 0: Trolo 0: o
JS, (.){4} => 0: Trol 1: l
JS', (.){4} => 0: Trol 1: olo!
PHP, (.){4} => 0: Trol 1: olo! 0: l 1: !
有什么规范性的答案吗?它的语义是什么?
输出没有正确标记,仅此而已。
首先,应该发生什么?如果重复一个组,则每个新实例都会覆盖上一次捕获。如果根本不使用该组,它将返回一个空字符串或类似JS中的undefined
的东西(这取决于风格)。关于这件事,有一篇关于定期出版的好文章。
现在我们如何获得您的结果?让我们从JavaScript开始。
标记为JS
的所有实例(非全局实例)都符合上述描述。它们匹配0
中所需的字符数量,并捕获1
中的最后一个字符。所以我们可以忽略这些。
全球的是怎么回事?这里的输出被错误地解释了。当您将全局标志与String.match()
函数一起使用时,您将不再获得所有捕获的数组,而只获得所有匹配的数组(为每个匹配分组0
)。因此,在只有一个匹配的+
、*
和{5}
的情况下,您只能得到一个结果。对于{4}
,目标字符串中有足够的空间进行两次匹配,因此生成的数组包含两个元素。要获得带有全局标志的所有捕获,您需要编写一个循环并使用RegExp.exec()
(它一次只提供一个匹配,但它的所有捕获)。
PHP是怎么回事?它似乎在使用preg_match_all
,不管怎么说,它是全局的,这就是为什么使用g
没有效果的原因。+
再次给出您所期望的结果。{5}
也是如此。
另外两个怎么了?在这里,对输出的解释是错误的。默认情况下,preg_match_all
给出一个二维数组,其中第一个索引对应于组,第二个索引对应匹配。在你的输出中,它被反过来解释。因此,当存在多个匹配时,第一对0
和1
是找到的两个匹配的全部匹配。第二对0
和1
是您在这两场比赛中捕捉到的。
因此,对于*
,首先获得完整的字符串作为匹配,最后一个字符作为捕获(标记为0
的两个字符),这是正确的。然后,由于*
允许零宽度匹配,因此在字符串的末尾会得到另一个(空)匹配,以及一个空捕获。不过,我不知道为什么相应的JS'
示例不包含额外的空字符串,因为String.match
也会做同样的事情。
对于{4}
,您只得到两个匹配(Trol
和olo!
),就像JavaScript的情况一样,分别捕获l
和!
,这同样非常好。
- jquery点击函数select&取消选择
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- Angular js-返回一个包含类似
- 一点javascript元编程&可链接的设置器
- 通过JSON&比较时间
- Jquery模板,如果xx&&如果yy
- jQuery工具验证器自定义效果-添加&消除影响
- Twitter引导程序Typeahead-Id&标签
- AngularJS&JSON-从Previous&下一个对象
- 什么是&&在没有if的行中的变量之间
- 关于引入外部javascript文件的问题&css通过https
- 指令的模板必须只有一个根元素:With restrict E&替换true
- 使用ajax的服务器端分页&jQuery
- Javascript,如果条件在没有&&逻辑运算符当&&它不起作用
- 如何使用dropzone&vueJs
- 如何准确执行加载脚本&退出弹出窗口
- 如何添加CSS&JavaScript进入Windows窗体应用程序C#.net
- Solr查询以按日期月份获取数据&年
- 显示&作为&在jsp中使用angularjs而不使用ng-bind-html
- 如何惯用地手动销毁scope&在AngularJS中重新创建