下一个正则表达式构造不起作用,为什么?

时间:2011-02-24 12:29:10

标签: regex

我有下一个命令行选项,我需要以名称 - 值格式分割:

-table tab -delimiter "," -limit:10

正则表达式构造是:

(?<=[-{1,2}|/])(?<name>[a-zA-Z0-9_]*)[ |:|"]*(?<value>[0-9A-Za-z.?=&\|+ :'*(),\\]*)(?=[ |"]|$)

我的问题在于分隔符选项,当我放置-delimiter "|"-delimiter ":"时,正如我包含这些字符一样,regexp构造不起作用,在这些情况下:name = delimiter,但value等于空,为什么?

感谢您的帮助。

编辑: 蒂姆和加布,谢谢你的帮助。 有效的最终结构是:

(?<=-{1,2}|/)(?<name>[a-zA-Z0-9_]*)\s*:?\s*"? *(?<value>[0-9A-Za-z.?=&\|+ :'*(),\\]*)(?=[ "]|$)

2 个答案:

答案 0 :(得分:2)

你的正则表达式中有一些错误:

[ |:|"]*匹配以下零个或多个字符:空格,|:"。您似乎正在使用它来识别namevalue之间的可能分隔符。

当然,在-delimiter "|"-delimiter ":"中,它会匹配delimiter之后的所有字符,而不会为value部分留下任何内容。由于这是可选的,因此正则表达式成功匹配而不填充value部分。

另一件事:

你可能不想要

(?<=[-{1,2}|/])

而是

(?<=-{1,2}|/)

您似乎应该阅读character classes

要修复正则表达式,我们需要知道您尝试实施的规则。究竟什么可以分隔名称/值对?

答案 1 :(得分:1)

您的问题出现在[ |:|"]* - 看起来好像您认为|在括号内表示“或”,即使您明显不在下一组括号中使用它。

您可能只想[ :"]*,这会使"|"正常工作。不幸的是,该组匹配任意数量的可以是空格,冒号或引号的字符,这意味着":"被认为是名称和值之间的空格的一部分。您需要更好地定义名称和值之间允许的字符集。

我建议:\s*:?\s*"?(任意数量的空格,后跟可选冒号,后跟任意数量的空格,后跟可选引号)。