用eCmascript Regex验证Python列表索引语法



我正在编写一个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

最新更新