Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Ruby 如何在正则表达式中强制执行顺序?_Ruby_Regex - Fatal编程技术网

Ruby 如何在正则表达式中强制执行顺序?

Ruby 如何在正则表达式中强制执行顺序?,ruby,regex,Ruby,Regex,在我的Rails应用程序中,我有一个正则表达式: /\A(?:\{(?:YYYY|YY|MM|DD|N{2,6})\}|[A-Za-z_.#-])*\z/ 例如,它匹配如下字符串:{YY}{MM}{DD}{NNNN} 有没有办法强制执行{YY}、{MM}、{DD}和{NN}的顺序,例如 {DD}{MM}{YY}{NNNN} 。。。无效吗 为了使这变得更加复杂,这些元素之间也应该允许字母、破折号和下划线 所以这个字符串也应该是有效的: {YY}-{MM}-{DD}{NNNN} 感谢您的帮助。要确

在我的Rails应用程序中,我有一个正则表达式:

/\A(?:\{(?:YYYY|YY|MM|DD|N{2,6})\}|[A-Za-z_.#-])*\z/
例如,它匹配如下字符串:
{YY}{MM}{DD}{NNNN}

有没有办法强制执行
{YY}
{MM}
{DD}
{NN}
的顺序,例如

{DD}{MM}{YY}{NNNN}

。。。无效吗

为了使这变得更加复杂,这些元素之间也应该允许字母、破折号和下划线

所以这个字符串也应该是有效的:

{YY}-{MM}-{DD}{NNNN}


感谢您的帮助。

要确保订单,您的正则表达式需要确保使用订单。目前,您只需单独查找
YY
MM
,等等。相反,您可以这样做:

\A(\{YY(YY)?\}\{MM\}\{DD\}\{N{2,6}\}|[A-Za-z_.#-])*\z
要在零件之间添加破折号或下划线,现在可以轻松添加它们:

\A(\{YY(YY)?\}[-_A-Za-z]*\{MM\}[-_A-Za-z]*\{DD\}[-_A-Za-z]*\{N{2,6}\}|[A-Za-z_.#-])*\z

当前,您的正则表达式匹配任何字母序列,即
abcde
。此外,您需要将
[A-Za-z.#-]
中的一个字符设置为位于花括号之间(可选)。在Ruby>=1.9上,下面的正则表达式调用子例程调用效果良好:

\A{YY(?:YY)?}([A-Za-z_.#-]?){MM}\g<1>{DD}\g<1>{N{2,6}}\z
\A{YY(?:YY)}([A-Za-z.#-]){MM}\g{DD}\g{N{2,6}\z

不,从我所能看到的来看,不完全是这样。示例:数字
12
可以是一天、一个月或一年(2012年或可能是1912年),如果不查看上下文,您将无法知道。您可以指定每个组件的范围,但这需要大量的工作。哦,没关系,我误解了您的问题。你实际上是在尝试匹配字符串YYMMDDNN。是的,我的问题确实有点误导。我确实需要这些字母来构建一个保存到数据库中的正则表达式。您可以为您的正则表达式
\a(?={YY(YY)?}.{MM}.{DD}.{NN{2,6}}\z)
预先设置一个正向的前瞻。请看这里的演示,谢谢。这已经是我迄今为止想出的任何办法的一百万倍了。不过,我仍然收到一个
不匹配的右括号
错误。目前正试图找出原因…我忘了打开一个,并从你的问题中复制了一个结尾看起来很酷,谢谢。我应该进一步探索那些
g
位。以前从未见过这些……不客气。你可以在这里找到更多关于他们的细节。另外,我不确定是否需要匹配
abcde
。。。如果不是,你最好让另一个答案的作者修改他们的答案。否则,它将误导任何未来的读者,因为他们将更多地依赖于公认的答案。