gpt4 book ai didi

c++ - C++中的正则表达式问题

转载 作者:行者123 更新时间:2023-11-27 22:44:16 25 4
gpt4 key购买 nike

我尝试使用以下正则表达式,它已经在 C# 中工作,也在 C++ 中工作,但它在 C++ 中不起作用。

std::regex r = std::regex("([^%]*(%[.[0-9]*]?[a-z])*)*", std::regex::extended);

它设法匹配了几个字符串并正确地拒绝了其他字符串,但是在字符串“%d smaller than available pbn % f %d”上卡住了(真的卡住了——没有错误),它应该拒绝(因为有一个 %前面没有紧跟合法的后缀)。

使用 std::regex r = std::regex("(([^%]*)(%(\\.([0-9]*))?[a-z])*)* "); 表现出与我之前描述的完全相同的行为。 (我假设这两个正则表达式是等价的——只有一个是像 C# 使用的规范形式,第二个是像 C++ 默认的 ECMAScript)

我不确定是什么问题。此外,我想将整个字符串与该模式匹配,以便仅当整个字符串作为一个整体匹配时它才匹配。所以我想为此目的使用 regex_match。我在 C++ 中使用以下代码:

if (std::regex_match(str, r))

此外,在 C# 中,我使用以下代码来执行该检查(整个字符串作为一个整体匹配):

        Regex^ r = gcnew Regex("([^%]*(%[.[0-9]*]?[a-z])*)*", RegexOptions::IgnoreCase);
Match^ m = r->Match(str);
if (m->Success && m->Groups[0]->Length== str->Length)

举个我希望正则表达式匹配的例子是:

在状态 %s(%d)中获得事件 %s(%d),移动到状态 %s (%d) ...

一些 %.34x 事件

并且正则表达式不应该匹配以下内容:

一些 % 东西。

用文字解释正则表达式应该做什么 - 它应该接受唯一的字符串,其中 % 的所有出现(如果有的话)都紧跟一个字母或 .46456x(又名。一些数字和一个字母) 并拒绝所有其他。

更新:有效的正则表达式是 ^([^%]|%((\\.)?[0-9]+)?[a-zA-Z])*$ 。问题是,与 C# 正则表达式不同,这个正则表达式真的很慢,并且会减慢 ALOTTT 的应用程序。所以我在想,也许最好使用 std::regex_search 来查找是否出现了 % ,它没有立即跟在后者或 .NUMBERS 之后是一个字母,或者是 NUMBERS 然后是一个字母。将感谢帮助执行此操作的正则表达式。

更新 2:

我正在使用正则表达式 ^.*%(?!([.]?[0-9]+)?[a-zA-Z]).*$ 有效,并且我将它与 std::regex_search 一起使用。它比以前的解决方案快得多,但仍然比 C# 版本慢得多(43 秒对 C# 中的不到 6 秒)。有没有办法进一步优化它?

最佳答案

给你,字符串中的所有 % 都必须合规。
如果是,则匹配整个字符串,如果不是,则不匹配
字符串。

我建议您使用 if ( regex_search( sTarget, sRx, sMatch, flags ) )
但是 regex_match() 会做同样的事情。

^(?:[^%]*%(?:\.[0-9]*)?[a-z])+[^%]*$

展开

 ^                             # BOS
(?: # Cluster begin
[^%]* # Not % characters
% # % found
(?: \. [0-9]* )? # optional .###
[a-z] # single a-z required
)+ # Cluster end, 1 to many times
[^%]* # Not % characters
$ # EOS

关于c++ - C++中的正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44999527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com