2012-02-29 113 views
0

我试图在Subversion中使用findstr和正则表达式来实现钩子脚本。目的是强制在日志消息中包含与我们问题跟踪工具(Atlassian JIRA)所用格式相匹配的条目。我们的问题每个由4到6个大写字母和2到4个数字组成,用连字符(例如“TEST-554”或CMMGT-392“)分隔。根据Subversion文档中的说明,我创建了一个批处理文件检查日志消息的格式正确的输入,使用正则表达式在findstr中使用正则表达式

findstr ([A-Z]{3,6}\-[0-9]{2,4}) > nul

我在一些测试工具测试的正则表达式,它似乎工作,但是当我运行它的一部分钩子脚本,它未能恢复比赛。作为一种“控制”,我尝试使用正则表达式

findstr ...... > nul

,并能找到一个匹配。任何人都可以看到我要去哪里?

+0

我的东西是一样的问题,因为在http://stackoverflow.com/q/358764/1176601 - ' {}'不支持... – Aprillion 2012-02-29 22:14:54

+0

谢谢,death 4月 - 这可能是问题的一部分;感谢bonsaiviking的回答,下面,我能够解决它。 – 2012-03-01 19:25:28

回答

1

findstr要求/R选项使用正则表达式,但它不支持扩展正则表达式,所以像计数({3,6})这样的东西不起作用。此外,零或一个匹配(?)不起作用,所以做你想做的事情会变得非常冗长。此外,英文Windows校对意味着[A-Z]与'A','b','B','z'和'Z'匹配,但不匹配'a'。这里的东西可能工作:

findstr /R "[ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9]" 

这个令人难以置信的冗长命令可能会超过(还没有检查)的壳体的最大指令长度,但基本上你想要做什么用含有一个单独的比赛为每个排列字母和数字计数。这是findstr的另一个奇怪之处:除非您使用/C选项,否则将使用匹配字符串中的空格将其分隔为单个匹配表达式。

如果除findstr之外还有其他选项,例如PowerShell,Python甚至VBScript,我都会建议您使用它。祝你好运!

编辑:这是我用来生成上面的命令Perl的一行代码:

perl -le 'BEGIN{$\=" "}for $x (3..6){for $y (2..4){print join("","[",A..Z,"]") x $x, "-", "[0-9]" x $y}}' 
+0

那么,“verbose” - “verbose-est”的最高级形式是什么?不管它是什么,你都会赢,而且还会受到伤害。可悲的是,它太长了,但它确实让我走上了正轨。我发现SVN和JIRA之间的链接不区分大小写,所以我始终用'[A-Z]'代替'[ABCD ...]'。只要用户输入一个有效格式的JIRA号码,提交就会通过,并发送到JIRA的链接。 – 2012-03-01 19:23:35