- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下代码,最初是使用 C++11 的正则表达式库 (#include <regex>
) 编写的,但现在使用 Boost 来尝试进行故障排除:
boost::regex reg(R"(.*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]*[0-9]+[a-z0-9]*)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z]+)).*?(\d+).*?((?:[a-z][a-z]+)))", boost::regex::icase);
boost::cmatch matches;
if (boost::regex_match(request, reg) && matches.size() > 1)
{
printf("Match found");
}
else
{
printf("No match.");
}
执行时,此代码似乎“卡住”在 boost::regex_match(request, reg)
上,好像需要很长时间才能处理。我等了五分钟让它处理(如果这是一个处理问题)但程序状态是一样的。
我tested the STL's regex
library version of the above code online on cpp.sh and onlinegdb ,它在那里完美地工作。然后我将这段代码复制到一个 VC++ 项目中,代码再次卡住:
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string request = "\\login\\\\challenge\\jRJkdflp3gvTzrwiQ3tyKSqnyppmaZog\\uniquenick\\Lament\\partnerid\\0\\response\\4767846ef255a88da9b10f7c923a1e6e\\port\\-14798\\productid\\11489\\gamename\\crysiswars\\namespaceid\\56\\sdkrevision\\3\\id\\1\\final\\";
std::regex reg(R"(.*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]*[0-9]+[a-z0-9]*)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z]+)).*?(\d+).*?((?:[a-z][a-z]+)))", std::regex::icase);
std::smatch matches;
if (std::regex_search(request, matches, reg) && matches.size() > 1)
{
printf("Match found");
}
else
{
printf("No match.");
}
}
相关字符串如下:
\login\challenge\jRJwdflp3gvTrrwiQ3tyKSqnyppmaZog\uniquenick\User\partnerid\0\response\4767846ef255a83da9b10f7f923a1e6e\port-14798\productid\11489\gamename\crysiswars\namespaceid\56\sdkrevision\3\id\1\final\
我在另一台计算机(全新项目)上的 Visual Studio 2017 安装上测试了相同的代码并得到了完全相同的结果......这似乎表明编译器正在做的事情导致代码卡住/采取长时间的处理。我目前无法在本地测试其他编译器。
正则表达式字符串checks out on regex101 ,所以功能上表达式是可以的。
这是针对 v141 的 Visual Studio 2017 Professional。
为什么会发生这种情况,我该如何解决?
最佳答案
你的问题是回溯问题之一。
在 boost 示例中,您使用 regex_match
强制匹配
整个字符串。
如果使用 regex_search
并添加 ^..$
,您将得到相同的结果。
但是,您的字符串永远无法匹配,因为您已强制它结束
在字母上,但字符串实际上以反斜杠结尾。
这会强制引擎重试所有这些 .*?
位置。
解决方法是在你的正则表达式的末尾放置一个最终的.*?
,这会让
正则表达式完成了匹配整个字符串的任务。
其他事情可能会有所帮助,您可以稍微清理一下正则表达式和/或添加一些
原子组和/或添加一些斜线代替那些 .*?
无论如何,使用这个:
^.*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]+)).*?((?:[a-z][ a-z]*[0-9]+[a-z0-9]*)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z0- 9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]* )).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+). *?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?( (?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?: [a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z]+)).*?(\d+).*?((?: [a-z][a-z]+)).*?$
输出
** Grp 0 - ( pos 0 : len 207 )
\login\challenge\jRJwdflp3gvTrrwiQ3tyKSqnyppmaZog\uniquenick\User\partnerid\0\response\4767846ef255a83da9b10f7f923a1e6e\port-14798\productid\11489\gamename\crysiswars\namespaceid\56\sdkrevision\3\id\1\final\
** Grp 1 - ( pos 1 : len 5 )
login
** Grp 2 - ( pos 7 : len 9 )
challenge
** Grp 3 - ( pos 17 : len 32 )
jRJwdflp3gvTrrwiQ3tyKSqnyppmaZog
** Grp 4 - ( pos 50 : len 10 )
uniquenick
** Grp 5 - ( pos 61 : len 4 )
User
** Grp 6 - ( pos 66 : len 9 )
partnerid
** Grp 7 - ( pos 76 : len 1 )
0
** Grp 8 - ( pos 78 : len 8 )
response
** Grp 9 - ( pos 94 : len 25 )
ef255a83da9b10f7f923a1e6e
** Grp 10 - ( pos 120 : len 4 )
port
** Grp 11 - ( pos 125 : len 5 )
14798
** Grp 12 - ( pos 131 : len 9 )
productid
** Grp 13 - ( pos 141 : len 5 )
11489
** Grp 14 - ( pos 147 : len 8 )
gamename
** Grp 15 - ( pos 156 : len 10 )
crysiswars
** Grp 16 - ( pos 167 : len 11 )
namespaceid
** Grp 17 - ( pos 179 : len 2 )
56
** Grp 18 - ( pos 182 : len 11 )
sdkrevision
** Grp 19 - ( pos 194 : len 1 )
3
** Grp 20 - ( pos 196 : len 2 )
id
** Grp 21 - ( pos 199 : len 1 )
1
** Grp 22 - ( pos 201 : len 5 )
final
关于c++ - 为什么这个正则表达式 "freeze"在VC++的程序中呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50239365/
嗨,任何人都可以告诉如何卡住 gridview 标题和基于轴的一些两列,因此 gridview 应该同时具有垂直和水平滚动,以便在垂直滚动时需要卡住标题,在水平滚动时卡住列。 最佳答案 嘿,我找到了一
我不小心在 venv 之外安装了 jupyter 及其所有依赖包。我正在尝试手动删除它们,但还有很多其他包(command-not-found、systemd-python、ubuntu-driver
Object.freeze() Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已
我一直在the tutorials上如何进行简单的音频识别。 首先,我输入时遇到错误 python tensorflow/examples/speech_commands/freeze.py 说 py
Closed. This question is opinion-based 。它目前不接受答案。 想改善这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答。 3年
我想写一个简单的网络代理,作为练习。这是我到目前为止的代码: def g = new Proxy() g.serverPort = 9000 println "starting" g.eachClie
我是 Java 新手,它不是我的第一种编程语言。我实际上尝试编写一个下载器来下载所有文件,直到服务器上的版本与客户端版本相同。 程序运行良好,但这是我无法解决的问题。 如果我运行这段代码: priva
我注意到当我在录制过程中暂停并恢复8次或更多次时,AVAudioRecorder(iOS)会挂起。在模拟器上,它无限期地挂起,在设备上,我得到以下错误: AudioQueueStop发布消息以杀死me
我正在为使用我的 lib 的 C 程序编写一个调试器应用程序。调试器获取应用程序名称并运行它( fork )。 我将调试消息从应用程序发送到我的调试器(每次它在库中输入一些函数时)。我需要能够通过调试
当我们从 Windows 迁移到 Linux 时,我们的 Nightwatch 测试不再运行。它只是卡住。 Selenium 服务器已在监听,并且 chrome_driver(linux 64 位)设
我的脚本使用 sqlalchemy 连接到 MySQL 数据库 from sqlalchemy import * engine = create_engine("mysql+mysqlconnecto
我正在寻找一种“卡住”页面的方法,这样我就可以检查出现的元素,例如当我将鼠标悬停在某个字段时。 我知道这里的答案:Firebug: How to inspect elements changing w
假设,我有一个 MenuBar,其中有几个 MenuItem。每个 MenuItem 负责打开不同的 Stage 窗口。当应用程序正在消化新 Stage 的代码时,如何避免单击上述 MenuItem
我有一个 元素。在某些时候,我不希望它再接受文本。出于某种原因,更改 type至 type="button"例如不允许。 如何制作我的 元素不再接受文本? 最佳答案 设为只读: $('#myInput
我现在什么都不懂。假设我有下一段代码(简化版): #include #include #include #include #include const auto k_sleep = std:
我想知道是否有一种方法可以“卡住”输入行,以便在 c 中将输入和输出彼此分开。例如,我的控制台输出目前是这样的: 1 OutputLine1 2 OutputLine2 但我希望它是这样的: 1 Ou
试试这个: int main() { std::fstream fin_fout("some.txt"); std::istream_iterator beg(fin_fout),en
我正在尝试重写 xCmd,它可以在远程机器上启动进程。基本上,它将自身作为服务安装在目标计算机上,然后启动请求的进程。一切正常,但我注意到一个错误。 xCmd 通过管道进行通信,它使用 WriteFi
鲁比的 standard uri library在无法修改或修改不会造成伤害的对象上卡住有很多用途: user, password = ui.split(':'.freeze, 2) #
我正在尝试用 Javascript 创建一个枚举。使用的javascript代码是 var FeatureName = { "FEATURE1": 1, "FEATURE2": 2, "FEATURE
我是一名优秀的程序员,十分优秀!