【发布时间】:2017-11-22 07:11:10
【问题描述】:
我正在编写一个 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[]上失败。我该怎么做?
我正在使用默认具有 ECMAScript 语法的 C++ 11 正则表达式库。
谢谢。
【问题讨论】:
-
如果你想要的只是语法有效,那么你就无法知道它是否是一个列表。
a['stuff', f(1, 2, 3), a+b.blah]这样的东西在语法上是有效的。 -
好吧,它看起来不会太长,但您可以稍微缩短它并添加一个前瞻来限制空括号 -
R"(^[_a-zA-Z]\w*\[(?! *\]) *-? *\d*(?: *: *-? *\d*){0,2} *\])"