我正在编写一个C 代码,该代码将字符串作为输入并检查该字符串是否具有有效的Python列表索引语法。例如:
a[0]
,a[:]
,a[::]
,a[0:]
,a[-1::]
,a[ 2 : 1:2]
a[: -1:]
,a[::- 1]
,a[1:10:2]
,等等。
到目前为止,我有以下正则表达式:
^[a-zA-Z_][a-zA-Z0-9_]*[([ ]*-?[ ]*[0-9]+[ ]*)*:?([ ]*-?[ ]*[0-9]+[ ]*)*:?([ ]*-?[ ]*[0-9]+[ ]*)*]$
但是,这对我来说太久了,我想知道是否有更好的方法可以做到这一点。同样,上述正则表达式将匹配a[]
,该表达式是不受欢迎的。我刚刚开始尝试正则表达式,我的知识是有限的。所以我的问题是:
- 是构建正则验证python列表索引的更好方法?
- 我希望将正则罚款在
a[]
上失败。我该怎么做?
我使用的是C 11正则表达式库,该库默认情况下具有Ecmascript语法。
谢谢。
您可以使用
^[_a-zA-Z]w*[(?! *]) *-? *d*(?: *: *-? *d*){0,2} *]$
请参阅正则演示。可以用[[:blank:]]
或[ t]
替换空间以匹配水平的空格。
模式详细信息
-
^
-字符串的开始 -
[_a-zA-Z]
-_
或ascii字母 -
w*
- ASCII字母/DIGITS/_
-
[
-[
-
(?! *])
-]
不得有0 空格 -
*-? *
-0 空格,可选的-
,0 空格 -
d*
-
(?: *: *-? *d*){0,2}
-零,一两个出现:-
*: *-? *
-0 空格,可选的-
,0 空格 -
d*
-0 数字
-
-
*]
-0 空格和]
-
$
-字符串的结尾。
请参阅C 演示(请注意,使用regex_match
,^
和$
变得多余,可能会省略):
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::vector<std::string> strings;
strings.push_back("a[0]");
strings.push_back("a[:]");
strings.push_back("a[::]");
strings.push_back("a[0:]");
strings.push_back("a[-1::]");
strings.push_back("a[ 2 : 1:2]");
strings.push_back("a[: -1:]");
strings.push_back("a[::- 1]");
strings.push_back("a[1:10:2]");
strings.push_back("a[]");
std::regex rex1(R"([_a-zA-Z]w*[(?! *]) *-? *d*(?: *: *-? *d*){0,2} *])");
for (auto s : strings)
{
std::cout << "Next string: " << s;
if (regex_match(s, rex1)) {
std::cout << "<= Matched" << std::endl;
} else {
std::cout << "<= Not Matched" << std::endl;
}
}
return 0;
}
输出:
Next string: a[0]<= Matched
Next string: a[:]<= Matched
Next string: a[::]<= Matched
Next string: a[0:]<= Matched
Next string: a[-1::]<= Matched
Next string: a[ 2 : 1:2]<= Matched
Next string: a[: -1:]<= Matched
Next string: a[::- 1]<= Matched
Next string: a[1:10:2]<= Matched
Next string: a[]<= Not Matched