匹配方括号中的数字

时间:2015-05-05 10:48:17

标签: regex tcl

请尝试匹配文件中的以下字符串:

test/test/abc_xyz[2][0]/abc
test/test/abc_xyz[2]/abc
test/test/abc_xyz/abc

我在TCL脚本中使用regexp尝试了以下操作:

set match [regexp {^.*\/*\_xyz(|\[[0-9]{1,}\]|\[[0-9]{1,}\]\[[0-9]{1,}\])\/abc} $line extracted_string ]

使用这个正则表达式我设法提取这些行:

"test/test/abc_xyz[2]/abc"
"test/test/abc_xyz/abc"

但无论如何都无法提取类似于此的行:

test/test/abc_xyz[2][0]/abc

有人可以告诉我,我可能缺少什么吗?

2 个答案:

答案 0 :(得分:0)

在这种情况下,你有这个序列 - [,digit(s),] - 你想要匹配零次或多次。这导致:(?:\[\d+\])*作为一般RE。使用它来代替更复杂的部分,我们可以得到:

set match [regexp {^.*\/*\_xyz((?:\[\d+\])*)\/abc} $line extracted_string substring ]

这个更短,很多更容易理解。我还在那里添加了substring以获得括号中的序列。使用明智的string map空格括号来处理这个问题最好:

set numbers [string map {"[" " "  "]" " "} $substring]

现在您可以使用列表操作(llengthlindexforeach等)...

答案 1 :(得分:-1)

试试这个:更新^.*\/*\_xyz(\[\d+\])?\/abc

<强>解释

你的问题在(|\[[0-9]{1,}\]|\[[0-9]{1,}\]\[[0-9]{1,}\])阻止。 我想你想[05]之后xyz/abc(\[\d+\])之前

选择[05]

?

colObj = College.objects.get(id=1) name = "collegeName" colName = getattr(colObj, name) 一次或多次

它可能有帮助。的 demo