C++ C+中的正则表达式问题+;
我试着使用下面的正则表达式,它已经在C++ C+中的正则表达式问题+;,c++,regex,C++,Regex,我试着使用下面的正则表达式,它已经在C#中起作用,在C++中也起作用,但在C++中不起作用 std::regex r = std::regex("([^%]*(%[.[0-9]*]?[a-z])*)*", std::regex::extended); 它成功地匹配了几个字符串并正确地拒绝了其他字符串,但在字符串“%d”上卡住了(实际上卡住了-没有错误),它应该拒绝该字符串“%d”,因为该字符串前面有一个%没有立即加上合法后缀 使用std::regex r=std::regex(([^%]*)(
C#
中起作用,在C++
中也起作用,但在C++
中不起作用
std::regex r = std::regex("([^%]*(%[.[0-9]*]?[a-z])*)*", std::regex::extended);
它成功地匹配了几个字符串并正确地拒绝了其他字符串,但在字符串“%d”上卡住了(实际上卡住了-没有错误),它应该拒绝该字符串“%d”,因为该字符串前面有一个%没有立即加上合法后缀
使用std::regex r=std::regex(([^%]*)((\\.([0-9]*)?[a-z])*)”代码>表现出与我之前描述的完全相同的行为。(我假设这两个正则表达式是等价的,只是一个是标准形式,比如C语言使用,第二个是ECMAScript,比如C++默认)
我不确定是什么问题。
另外,我希望将整个字符串与该模式匹配,以便仅当整个字符串作为一个整体匹配时才匹配。因此,我想使用regex\u match
实现这一目的。我在C++中使用以下代码:
if (std::regex_match(str, r))
此外,在C#中,我使用以下代码执行该检查(确保整个字符串作为一个整体匹配):
仅举一个我希望正则表达式匹配的示例:
获取状态为%s
(%d
)的事件%s
(%d
),移动到状态%s
(%d
)
或
一些%.34x
事件
正则表达式不应与以下内容匹配:
一些%
东西
为了用文字解释正则表达式应该做什么-它应该接受唯一的字符串,即所有出现在其中的%前面(如果有)紧跟着一个字母或一个.46456x(又名一些数字和一个字母),并拒绝所有其他的
更新:
有效的正则表达式是^([^%]|%(\\)?[0-9]+)?[a-zA-Z])*$
。问题在于,与C#regex不同,这一版本的速度非常慢,并且会大大降低应用程序的速度。所以我在想,也许最好使用std::regex_search来查找是否有%的出现,而不是紧跟其后的是后者或是.number,然后是字母,或者是数字,然后是字母。如果有一个正则表达式能够做到这一点,我们将不胜感激
更新2:
我使用的是regex^.*%(?!([.]?[0-9]+)?[a-zA-Z]).$
,它可以工作,我将它与std::regex_搜索一起使用。它比以前的解决方案快得多,但比C版本慢得多(C版本为43秒,而C版本为不到6秒)。有没有办法进一步优化它 在这里,字符串中的所有%
必须符合要求。
如果是,则匹配整个字符串,如果不是,则不匹配
绳子
我建议您使用I.e.if(正则搜索(sTarget、sRx、sMatch、flags))
但是regex_match()也会做同样的事情
扩大
^ # BOS
(?: # Cluster begin
[^%]* # Not % characters
% # % found
(?: \. [0-9]* )? # optional .###
[a-z] # single a-z required
)+ # Cluster end, 1 to many times
[^%]* # Not % characters
$ # EOS
现在,字符串中的所有%
必须符合要求。
如果是,则匹配整个字符串,如果不是,则不匹配
绳子
我建议您使用I.e.if(正则搜索(sTarget、sRx、sMatch、flags))
但是regex_match()也会做同样的事情
扩大
^ # BOS
(?: # Cluster begin
[^%]* # Not % characters
% # % found
(?: \. [0-9]* )? # optional .###
[a-z] # single a-z required
)+ # Cluster end, 1 to many times
[^%]* # Not % characters
$ # EOS
一个与VC++一起工作并符合您描述的简单正则表达式是
std::regex("^([^%]|%(\\.[0-9]+)?[a-zA-Z])*$", std::regex::extended)
(如果%.
后面的数字是可选的,则将[0-9]+
更改为[0-9]*
。使用VC++并符合您的描述的简单正则表达式是
std::regex("^([^%]|%(\\.[0-9]+)?[a-zA-Z])*$", std::regex::extended)
(如果%.
后面的数字是可选的,则将[0-9]+
更改为[0-9]*
。这与sln类似,但它较短,不需要%
部分来匹配:
^(?:[^%]*(?:%\.?[0-9]*[a-z])?)*$
首先-介于^
(行首)和$
(行尾)之间的所有内容都是可选的,因此接受空字符串
在可选的非捕获组(?:…)
中,匹配除%
以外的任意数量的对象。然后,可选地匹配一个%
,可选地后跟一个
,然后匹配任意数量的数字,最后匹配一个字母。重复此操作任意次数
(我,正如其他人所回答的,以及问题中的正则表达式所暗示的,假设OP并不意味着“前面紧跟着一个字母”,而是后面紧跟着一个字母,对吗?)
.这是类似的sln,但它较短,不需要%
部件来匹配:
^(?:[^%]*(?:%\.?[0-9]*[a-z])?)*$
首先-介于^
(行首)和$
(行尾)之间的所有内容都是可选的,因此接受空字符串
在可选的非捕获组(?:…)
中,匹配除%
以外的任意数量的对象。然后,可选地匹配一个%
,可选地后跟一个
,然后匹配任意数量的数字,最后匹配一个字母。重复此操作任意次数
(我,正如其他人所回答的,以及问题中的正则表达式所暗示的,假设OP并不意味着“前面紧跟着一个字母”,而是后面紧跟着一个字母,对吗?)
.无论如何,存在许多回溯问题。请显示准确的错误消息std::regex_error
(与大多数例外情况一样)包含一条消息,确切说明问题所在。完整错误是:“regex_error(error_brack):表达式包含不匹配的[and]”。我正试图在部分[[0-9]*]中写入此消息[0-9]*的整个部分是可选的。所以我想。但我不确定是什么?:“…整个[0-9]*部分是可选的”这没有意义。在不需要引用任何内容的上下文中,[[0-9]
将是与
或[
匹配的字符类,或者是从0
到9
的数字;*
意味着atom可以重复0次或更多次;]
将是一个字端方括号,?
将仅适用于]
<代码>?
无法应用于[[0-9]*]
,因为这不是