2010-02-09 60 views
2

我希望有一个正则表达式,将匹配:问题的一个正则表达式

A型与ID:

[Image=4b5da003ee133e8368000002] 
[Video=679hfpam9v56dh800khfdd32] 

随着之间0和n附加选项分离与@

[[email protected]:small] 
[[email protected]:[email protected]:true] 

我到目前为止:

\[[a-zA-Z]*=[a-zA-Z0-9]*[@[a-zA-Z]*:[a-zA-Z]*]*\] 

...但它不符合所有情况。

+0

这已解决,但它使我遇到了另一个问题,在这里贴出:http://stackoverflow.com/questions/2230372/getting-some-elements-in-a-string-using-a-regex – marcgg 2010-02-09 15:56:36

回答

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

您正在用[]包围该部分,如您所知,这是为一个类,您只需要一个分组。你还应该确保第一个匹配至少有一个字符,看起来ID块总是有24个字符,如果是这种情况,用{X}来定义长度为X的重复。

+0

谢谢,那就是问题 – marcgg 2010-02-09 14:56:49

+0

还有一个问题:如果你这样做,它不会得到所有的选项,只有最后一个。在例子“ [Image = 4b5da003ee133e8368000002 @ size:small @ media:true]”我只能检索“@media:true”,当我还需要size:true – marcgg 2010-02-09 15:01:53

+0

这就是尾部*的含义。如果您想将整个部分分组到一个变量中,则需要另一对圆括号,并在打开内部零部件后添加'?:'。这将避免创建反向引用。下一场比赛应该是当前情况下的下一个变量。 – nlucaroni 2010-02-09 15:13:26

3

不应该可以将其他选项分组(而不是括号!)并标记为可选(而不是*)?你应该使用+而不是*,否则一个空字符串将被匹配。

\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]*:[a-zA-Z]*)*\] 
+0

谢谢你的回答。 nlucaroni速度更快,所以他得到的支票,但这也是正确的 – marcgg 2010-02-09 14:58:28

+0

我会进一步扩大,并使可选字段存在时所需的关键和价值,虽然OP没有解决这个问题。 '[[a-zA-Z] + = [a-zA-Z0-9] +(@ [a-zA-Z] +:[a-zA-Z] +)?\]' – 2010-02-09 14:59:06

+1

?是(@ [a-zA-Z] *:[a-zA-Z] *)的错误量词。有0到n个附加选项。 – Erlock 2010-02-09 15:03:43

2
\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)*\] 

您需要附上可选的组括号,括号没有。

+0

就像我对andidog说的那样,nlucaroni速度更快,所以他得到了支票,但这也是正确的。谢谢:) – marcgg 2010-02-09 14:58:52

0
\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)?\] 

我认为这将是更好一点:)

1
^\[\w+=\w+(@\w+:\w+)*\]$ 

我想这应该可以更具体。

+1

有趣的解决方案,但它也包括下划线,我不想 – marcgg 2010-02-09 15:04:53