Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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,我想要一个符合以下条件的正则表达式: ID为的类型: [Image=4b5da003ee133e8368000002] [Video=679hfpam9v56dh800khfdd32] 0到n个附加选项之间用@分隔: [Image=4b5da003ee133e8368000002@size:small] [Image=4b5da003ee133e8368000002@size:small@media:true] 到目前为止,我有: \[[a-zA-Z]*=[a-zA-Z0-9]*[@[a-z

我想要一个符合以下条件的正则表达式:

ID为的类型:

[Image=4b5da003ee133e8368000002]
[Video=679hfpam9v56dh800khfdd32]
0到n个附加选项之间用
@
分隔:

[Image=4b5da003ee133e8368000002@size:small]
[Image=4b5da003ee133e8368000002@size:small@media:true]
到目前为止,我有:

\[[a-zA-Z]*=[a-zA-Z0-9]*[@[a-zA-Z]*:[a-zA-Z]*]*\]
。。。但并不是所有的案例都符合

\[[a-zA-Z]+=[a-zA-Z0-9]{24}(@[a-zA-Z]+:[a-zA-Z]+)*\]
                           ^                    ^

您将该部分用[]括起来,正如您所知,它是用于类的,您只需要一个分组。您还应该确保第一个匹配项至少有一个字符,并且id块似乎总是有24个字符,如果是这种情况,请使用{X}定义长度X的重复。

附加选项是否应该分组(而不是括号!)并标记为可选(而不是*)?您应该使用+而不是*否则将匹配空字符串

\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]*:[a-zA-Z]*)*\]
您需要将可选组括在括号中,而不是括号中

\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)?\]
我认为这样会好一点:)


我想应该可以更具体一些。

谢谢你的回答。nlucaroni的速度更快,所以他得到了检查,但这也是正确的。我会进一步扩展,并在出现可选字段时生成所需的键和值,尽管OP在问题中没有说明这一点<代码>\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)?\]?是(@[a-zA-Z]*:[a-zA-Z]*)的错误量词。有0到n个额外选项。就像我对andidog说的,nlucaroni更快,所以他得到了支票,但这也是正确的。谢谢:)还有一个问题:如果你这样做,它不会得到所有的选项,只有最后一个。在示例中,“[图像]=4b5da003ee133e8368000002@size:small@media:true]“当我还需要size:true时,我只能检索“@media:true”。这就是尾随*的用途。如果要将整个部分分组为一个变量,则需要另一对圆括号,并在开始的内部参数后添加“?:”。这将避免创建反向引用。你的下一个匹配应该在当前情况下的下一个变量中。你应该检查ruby的标准,看看它如何支持(?:data)@nlycaroni:我不确定你的意思。假设我想在两个独立的变量中得到“size:small”和“media:true”,我应该如何继续?这有点超出了这个问题的范围,但是……:)我最后提出了另一个问题:有趣的解决方案,但它也包括下划线,我不希望它被解决,但它让我遇到了这里提到的另一个问题:
\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)?\]
^\[\w+=\w+(@\w+:\w+)*\]$