- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
从没想过可以编写一个永不返回的正则表达式。
正则表达式
/^((?:\d|\w{1,2}[-\d\s])(?:[-\s\d]|\w{1,2}[-\d\s])*\d)$/
用于匹配以一个数字或两个字母开头,后跟破折号、空格或数字并以数字结尾的数字。中间可能会重复起始模式,也可能会出现空格或破折号。
示例:1234、de-12943、EN - 12de -50
以下示例代码不会终止:
ruby
#!/usr/bin/ruby
string = "101000000750000000000000000000000001000038127OXMOO0OOOOO00000000000N9"
re = /^((?:\d|\w{1,2}[-\d\s])(?:[-\s\d]|\w{1,2}[-\d\s])*\d)$/
p re.match("101000000750000000000000000000000001000038127OXMOO0OOOOO00000000000N9")
斯卡拉
"""^((?:\d|\w{1,2}[-\d\s])(?:[-\s\d]|\w{1,2}[-\d\s])*\d)$""".r findFirstIn "101000000750000000000000000000000001000038127OXMOO0OOOOO00000000000N9"
删除 anchor (^, $) 可让正则表达式快速终止。
尝试使用 Ruby 和 Scala。
那里发生了什么? anchor 不应该导致更快的终止吗?
最佳答案
首先,\w
不是字母,而是[a-zA-Z0-9_]
。因此,如果您真的只想要字母,请使用 [a-zA-Z]
。
其次,我想你可能有一个案例 catastrophic backtracking .
您的正则表达式显然不会超过 OXM
,因为无法匹配您的模式中的三个连续字母。如果您删除 $
anchor ,正则表达式会很乐意匹配那里,但是当您离开它时,正则表达式将失败并开始回溯。
所以假设它匹配 OX
和 \w{1,2}
但失败了。然后它将丢弃整个第二个非捕获组的最后一次重复并返回一个步骤,它匹配 7
和 [-\s\d]
。现在它将尝试将 7O
或 7
与 \w{1,2}
匹配,但随后再次无法匹配 [ -\d\s]
分别针对 X
或 O
。再退一步,它尝试将 27
或 2
与 \w{1,2}
重新匹配,但再次失败。等等等等。返回得越远,可能再次将 [-\d\s]
与一个字母匹配,然后引擎将一直前进到 OXM
再次开始乐趣。当回溯最终到达字符串的开头和您的第一个交替时,它也会尝试该交替的所有三个选项,并将一遍又一遍地执行整个操作。
让我试着通过写出重复中使用了哪些交替来形象化回溯的第一步。每两行中的第一行是测试字符串,第二行包含使用的相应正则表达式结构。每次尝试都在最后一个字符处失败。
... 1 2 7 O
... [-\s\d] [-\s\d] [-\s\d] [-\s\d]
... 1 2 7 OX M
... [-\s\d] [-\s\d] [-\s\d] \w{2} [-\d\s]
... 1 2 7 O X
... [-\s\d] [-\s\d] [-\s\d] \w{1} [-\d\s]
... 1 2 7O X
... [-\s\d] [-\s\d] \w{2} [-\d\s]
... 1 2 7 O
... [-\s\d] [-\s\d] \w{1} [-\d\s]
... 1 27 O
... [-\s\d] \w{2} [-\d\s]
... 1 2 7 O
... [-\s\d] \w{1} [-\d\s] [-\s\d]
... 1 2 7 OX M
... [-\s\d] \w{1} [-\s\d] \w{2} [-\d\s]
... 1 2 7O X
... [-\s\d] \w{1} \w{2} [-\d\s]
等等。我希望你明白了。很难用几行 ASCII 将其形象化。
我想,只需将 \w
更改为适当的字符组就可以解决问题,因为等效组合较少。试试吧。
关于ruby - 无休止的正则表达式 : Regex couldn't terminate while matching a 69 character String (killed after a week),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13268240/
这里的 IT 网络/编程学生试图完成一项作业,但我遇到了障碍。我们的任务是读取文本文件,将单词放入 ArrayList 中,并对内容执行字符串操作。我能够将单词拉入 ArrayList、按升序对内容进
编辑:我收到以下错误代码: Error adding accessory The operation couldn’t be completed. (HMErrorDomain error 2.) 和
您好,我正在尝试测试套接字激活机制,但无法连接到服务器。 curl --unix-socket/run/gunicorn.sock本地主机 curl: (7) Couldn't connect to
所以我安装了sandbox (运行 centOS)来自 hortonworks在 virtualBox带网络配置>>> bridged network我编辑了bashrc导出http_proxy和 h
我目前正在开发一个android应用程序,提交一个post请求并处理相应的响应。 我能够将发布请求发送到相应的 URL,但是当我尝试检索响应时,我得到了一半的 HTML 内容,然后是“*无法从 STD
我在将 ServiceLoader 集成到我的 Android 应用程序以集成插件系统时遇到问题。 public class StrategieClassLoader extends URLClass
我有一个类似于以下的自定义数据类型: data Token = Number Int | Otherthings 我希望能够以一种方式使用“数字”,以另一种方式使用其他东西。所以
当我尝试从 Visual Studio Code 运行一个简单的 React Native 应用程序时,我收到以下错误消息。 Scanning folders for symlinks in C:\P
我最近从Java搬到了Kotlin。将整个项目转换为Kotlin,将pom.xml转换为build.gradle。我正在使用Kotlin,Gradle,Cucumber Sernity,Appium构
我在执行docker-compose命令时遇到Powershell中的错误: 尽管从Docker Quickstart Terminal运行相同的命令可以正常工作: 最佳答案 确保首先在Powersh
当我运行docker build时,我得到了: Sending build context to Docker daemon 10.24kB WARN[11935] Couldn't run aup
我在运行 SDL 程序时遇到此错误。它编译得很好,但是窗口打开了一小会儿然后就关闭了。 这是我的代码: //Using SDL and standard IO #include #include
我正在编写一个基于 Google map 的 Android 应用程序。应用程序本身运行良好,没有任何问题。我可以看到 map ,缩放到我的当前位置等等。根据 AndroidManifest.xml,
我在实际设备上仅在生产和开发容器上都遇到了这个错误。模拟器能够很好地获取记录。这发生在通过 XCode 运行的开发构建、TestFlight 构建和 AppStore 上的实时生产构建上。 所有设备
我正在创建一个模板化的快速排序函数,它应该允许我使用迭代器对一个定制的双向链表类进行快速排序。我遇到了错误 In file included from main.cpp:21.0: quicksort
我有一个模板类和一个具有模板返回类型的函数: template class Wrapper { public: Wrapper(const T& _data) : data(_data) {
将 Jersey 从 1.15 版升级到 1.17 版后,它开始记录以下消息: Apr 2, 2013 5:13:06 PM com.sun.jersey.server.wadl.generators
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个 android 应用程序在我将设备更新到 android 4.4 (kitkat) 之前一直运行没有问题。 现在我开始收到这个错误,并且程序的某些部分在日志 cat_ 中被破坏了_ Andr
我通过 git clone 成功安装了 Directus CMS。在数据库中创建了 15 个表。在/config 文件夹中,我的 projectkey.php 文件也已创建。安装后我想使用我的凭据登录
我是一名优秀的程序员,十分优秀!