前言

某日在逛stackoverflow时,发现侧边栏的Hot Network Questions里有一例codegolf的问题Does it repeat?。

挑战

好奇之下点入观看,该题主的挑战如下:

当一条字符串中含有2(组/个)连续的字符时,该字符串可以称之为“连续的字符串”。

例:2034384538452可以成为“连续的字符串”,因为其含有2次连续的3845。

请找出能够判断“连续的字符串”的方法,输入可以用字符串或数组,输入不能为空,并且字符串长度必须大于等于1。

题主使用1与0来区分true和false,挑战者也可以使用其他不同的值来区分true/false。

abcab -> 0bdefdefg-> 1Hello, World! -> 1pp.pp/pp -> 1q-> 0

21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

解法

所有答者中,大部分常用编程语言的答者都使用正则进行判断,例如:

PHP的解法

=preg_match('#(.+)\1#',$argn);

importre

re.compile(r'(.+)\1').search

s=>/(.+)\1/.test(s)

a->a.matches(".*(.+)\\1.*")

虽然也有使用循环对比来解答的,但这不是我的关注点。

所有正则的解法中,归根结底就是6个字符(.+)\1

.+和()的意思好理解,毕竟是常用的。\1虽然能猜到用途,但是无论如何想不起来是干啥的,进入查询模式。

反向引用(backreference)

根据揭开正则表达式的神秘面纱一文,发现原来正则除了贪婪和非贪婪外还有名为“反向引用”的高级规则。

表达式在匹配时,表达式引擎会将小括号 “( )” 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。

“\1” 引用第1对括号内匹配到的字符串,”\2” 引用第2对括号内匹配到的字符串……以此类推。

如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 “(“ 在前,那这一对为先。

在正则(.+)\1中,\1等于(.+)中匹配到的值,也就是连续2次相同的值。

尝试

使用Python进行快速尝试

deffa(regex,subject):return re.findall(regex,subject);

匹配出3连的连续字符串

fa(r'(.+)\1\1','d123123123e');#['123']

fa(r'(.+)\1\1','d112233e');#[]

#或

fa(r'((.+))\1\2','d123123123e');#['123']

匹配出html标签内的文字

fa(r'.*(.*).*','asdwas

ssdsdasdd');#[('td', 'ssd')]

fa(r'.*(.*).*','asdwasfind moresda');#[('a', '/a/b','find more')]

fa(r'.*(.*).*','asdwasfind moresda');#[('a', '/a/b', 'find more')]

总结

反向匹配在业务代码中能用的地方不是很多,假如是纯粹去掉html标签的话,php有strip_tags,python也有对应的stripogram包,简略用法看这里。

多学一点,在leetcode或codewars这类的刷题网站里以最少的代码量达到要求也能有成就感。

在这里挂个我的codewars肩章,欢迎一起来玩儿。

Reference

java 正则 反向引用_正则之反向引用相关推荐

  1. 方法引用_通过对象名引用成员方法

    方法引用符 双冒号:: 为引用运算符,而它所在的表达式被称为方法引用.如果Lambda要表达的函数方案已经存在于某个方 法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者. 语义分析 ...

  2. java 匹配开头结尾_正则匹配 符合以什么开头以什么结尾的

    [众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪 ...] java private static String ...

  3. java汽车牌号验证_正则验证车牌号码,包括新能源车牌

    正则验证 20180818 直接上代码 // 正则验证车牌,验证通过返回true,不通过返回false function isLicensePlate(str) { return /^(([京津沪渝冀 ...

  4. 反向链接 反向代理_妇女与反向渠道

    反向链接 反向代理 Yesterday Drew and I were fortunate enough to be invited down to take part in the 12 hour ...

  5. java 获取home路径_关于JAVA_HOME等引用路径

    初学者往往在配置环境变量的时候会遇到一些小的细节问题,比如为了方便以后运行tomcat,eclipse等,我们常常配置一个名为JAVA_HOME的变量(如:D:\Program Files\Java\ ...

  6. perl数组硬引用_带有哈希引用的Perl数组引用(Perl Array Reference with hash reference)

    带有哈希引用的Perl数组引用(Perl Array Reference with hash reference) my $var1=[{'a'=>'1','b'=>'2'},1]; pr ...

  7. nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法

    demo放在了GitHub 内存泄漏的原因: self强引用timer.timer添加在runloop上,只要timer不销毁self就销毁不了.当然了你可以选择在viewWillDisappear中 ...

  8. vue 公用页面引用_关于vue全局引用公共的js和公共的组件的折腾

    前沿 最近在项目开发中遇到一些需要全局引用的公共js,或者公共组件,早就烦死了那种每个页面都写一遍,都引用一个js的写法,正好vue解决了这个额问题,于是乎就开始折腾,折腾的过程中也发现了一些自己之前 ...

  9. python字典弱引用_如何使用弱引用优化 Python 程序的内存占用?

    Python 的垃圾回收机制通过引用计数来决定一个对象要不要被回收.当一个对象被引用次数为0时,它就会被作为垃圾回收从而释放 Python 内存.但有些情况下,我们的代码可能在不经意间导致某些实际上我 ...

最新文章

  1. Python怎么利用多核cpu
  2. Python夺冠,老牌编程语言该走向何方?网友:崩溃
  3. 欧洲两个研究团队开发出了让截肢者能感觉到并准确抓住物体的仿生手
  4. iOS开发火了九年,这些错误你还在犯嘛?
  5. python操作excel-python 操作excel
  6. DevExpress.XtraReports报表,动态设置报表布局
  7. mysql 数据结构设计_MYSQL 设计数据结构需注意问题
  8. BZOJ 1001 狼捉兔子
  9. Unity3D之Material(材质、着色器、纹理)
  10. OpenCV-python学习笔记(一)——image basics输入输出,像素处理和绘制图形
  11. 如何写出让同事膜拜的漂亮代码?
  12. 销售订单无法使用折扣(其他可以正常使用)
  13. 历年软件设计师 试卷 参考案例解析
  14. 前后端分离的时代,团队间的完美协作
  15. java项目有个x_GitHub - somnl/X-SpringBoot: X-SpringBoot是一个轻量级的Java快速开发平台,能快速开发项目并交付【接私活利器】...
  16. Vue使用谷歌统计和百度统计
  17. 智能名片为什么使用场景都是微信小程序?哪些新玩法值得一试?
  18. 华为什么型号支持鸿蒙,哪些华为手机支持鸿蒙系统?华为支持鸿蒙OS手机型号清单...
  19. QObject::killTimer: Timers cannot be stopped from another thread
  20. 怎样成为一个PS高手

热门文章

  1. 什么是奇异值?奇异值分解是什么?SVD分解详解及实战
  2. 基于变分自动编码器(Variational Autoencoders)进行推荐系统的实施、Keras实现并可视化训练和验证误差、最后给出topK准确率和召回率
  3. php 快速导出csv,php快速导出csv格式数据程序代码
  4. python和单片机的用处哪个大_用Python控制硬件1-Python控制硬件的几种方式
  5. php bc函数库,PHP高精确度运算BC函数库实例详解
  6. MySQL数据库have_openss_MySQL 关于OpenSSL证书支持检查方式
  7. debian/ubuntu 上安装和使用 Emacs
  8. Matplotlib使用日期作为横坐标
  9. 大数据引擎启动时常见错误汇总
  10. python同名包_可以使用两个同名的Python包吗?