【发布时间】:2019-05-07 17:47:21
【问题描述】:
我有两个可选值,当两者都存在时,它们之间需要一个逗号。如果存在一个或两个值,则可能结尾有逗号,但如果不存在任何值,则不允许使用逗号。
有效例子:
(first,second,)
(first,second)
(first,)
(first)
(second,)
(second)
()
无效示例:
(first,first,)
(first,first)
(second,second,)
(second,second)
(second,first,)
(second,first)
(,first,second,)
(,first,second)
(,first,)
(,first)
(,second,)
(,second)
(,)
(,first,first,)
(,first,first)
(,second,second,)
(,second,second)
(,second,first,)
(,second,first)
我有足够的 EBNF 代码 (XML-flavored),但是有没有办法可以简化它?我想让它更具可读性/更少重复。
tuple ::= "(" ( ( "first" | "second" | "first" "," "second" ) ","? )? ")"
如果用正则表达式更容易理解,这里是等效代码,但我需要 EBNF 中的解决方案。
/\(((first|second|first\,second)\,?)?\)/
当我们将其抽象为三个词时,这个问题变得更加复杂:"first"、"second" 和 "third" 都是可选的,但它们必须按顺序出现,用逗号,带有可选的尾随逗号。我能想到的最好的方法是蛮力方法:
"(" (("first" | "second" | "third" | "first" "," "second" | "first" "," "third" | "second" "," "third" | "first" "," "second" "," "third") ","?)? ")"
【问题讨论】:
-
如果您只使用
first和second,那么需要什么正则表达式? -
@WJS 我将我的问题减少到the simplest case。在我的真实代码中,
"first"和"second"实际上是复杂的表达式。出于 StackOverflow 的目的,它们是什么并不重要,所以我将它们设为原子。封装 FTW!