Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的正则表达式问题+;_C++_Regex - Fatal编程技术网

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]*]
,因为这不是