热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

raku:最长的比赛不做最长的比赛,但在第一场比赛后退出

我正在使用Raku2020.10。根据此页面,https://docs.raku.org/language/regexes#Longest_alternation:_|

我正在使用 Raku 2020.10。

根据此页面,https://docs.raku.org/language/regexes#Longest_alternation:_| , "|" 或带引号的列表是最长的匹配项。

> say "youtube" ~~ / /
?you? # expected "tube" to win the match
> say "youtube" ~~ / you | tube /
?you? # expected "tube" to win the match
> say "youtube" ~~ / tube | you /
?you? # expected "tube" to win the match

现在尝试“||” 而不是“|”:

> say "tubeyou" ~~ / you || tube /
?tube? # longest match or first match?
> say "youtube" ~~ / you || tube /
?you? # first match?

现在尝试网页示例:

> say 'food' ~~ / f | fo | foo | food /
?food? # works as expected
> say 'foodtubes' ~~ / f | fo | foo | food | tubes /
?food? # expected "tubes" (5 chars) to win
> say 'foodtubes' ~~ / tubes | f | fo | foo | food /
?food?
> say 'foodtubes' ~~ / dt /
?dt?
> say 'foodtubes' ~~ / dt | food /
?food?
> say 'foodtubes' ~~ / dt | food | tubes /
?food?

看起来像带有“|”的匹配引擎 在第一场有点长的成功比赛后退出。或者我做错了什么?

谢谢 !!!

回答


(这个答案建立在@donaldh 在评论中已经说过的内容之上)。

这是一个非常好的问题,因为它涉及到一些经常让人们误会正则表达式如何搜索字符串的问题:正则表达式从根本上一次搜索一个字符并返回它找到的第一个匹配项。您可以修改此行为(例如,环顾考虑其他字符;多个标志使正则表达式返回多个结果)。但是,如果您从对 regex 默认情况下的行为方式的基本了解开始,许多这些问题就会变得更加清晰。

因此,让我们将其应用于示例的一个轻微变体:

> `youtube' ~~ / you | ..| tube /
?you?

以下是正则表达式引擎如何看待它(在高级/简化术语中),逐个字符:

pos:0 youtube
^
branch 1 wants 'y'. Match!
branch 2 wants . (aka, anything). Match!
branch 3 wants 't' No match :(
pos:1 youtube
^
branch 1 wants 'o'. Match!
branch 2 wants . Match!
branch 2 completed with a length of 2
pos:2 youtube
^
branch 1 wants 'u'. Match!
branch 1 completed with a length of 3
...all branches completed, and 2 matches found. Return the longest match found.
?you?

这种逻辑的结果是,与往常一样,正则表达式返回字符串中的第一个匹配项(或者,更具体地说,从字符串中最早位置开始的匹配项)。|当多场比赛在同一个地方开始时,踢球的行为。当这种情况发生时,|意味着我们得到了最长的匹配。

相反,对于'youtube' ~~ / you | tube /,我们永远不会有多个匹配从同一个地方开始,所以我们永远不需要依赖 的行为|。(我们有多个比赛中的字符串,你可以用全局搜索看到:'youtube' ~~ m:g/ you | tube /

如果您想要字符串中所有匹配项中最长的(而不是第一个匹配项的最长选项),那么您可以使用以下内容:

('youtube' ~~ m:g/ you | tube /).sort(*.chars).tail






推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • 我是Python的新手,我正在用它进行一个难看的将表数据转换成db的小转换.该程序查看数据,在MySQL中创建一个表,然后将数据读入表中.在本节中,将检查标题行文本以对数据类型做出 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 点击上方“新机器视觉”,选择加”星标”或“置顶”重磅干货,第一时间送达很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做 ... [详细]
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
  • 这期内容当中小编将会给大家带来有关如何在php表单中使用正则表达式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可 ... [详细]
  • 2.ElasticSearch练习索引 : sms-logs-index类型:sms-logs-type   数据导入部分PUTsms_logs_indexsms_logs_typ ... [详细]
  • 前端开发中的重要一环:使用原生JavaScript封装jQuery库
    2019独角兽企业重金招聘Python工程师标准用原生js封装jquery的实现base.js***上官清偌*前台调用var$function(_this){return ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
author-avatar
dmcm0006
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有