命令行perl正则表达式找到悬空的Javascript逗号

时间:2011-05-26 14:37:16

标签: regex perl

你好我正在寻找一个Perl单行,如果可能的话,扫描我们所有的Javascript文件,找到所谓的“流氓逗号”。也就是说,来自数组或对象数据结构末尾的逗号,以及紧接在']'或'}'字符之前的逗号。

我遇到的主要挑战是如何使正则表达式检查]或}非贪婪。正则表达式需要跨越多行,因为逗号可以结束一行,然后是下一行的}或者},但我已经在Minimal Perl一书的帮助下想出了如何做到这一点。

另外,我希望能够将大量文件传递给这个Perl正则表达式(通过find / xargs),所以我想打印输入文件的名称,以及其中的行号文件。

以下是我的各种尝试,并不是特别接近我的bash历史。提前致谢:

find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+$/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+\]/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+[\]\}]/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+[\]\}]/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+[\]\}]/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+}/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+}?/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+}+?/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,$/' and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,$/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/\,$/ and print $_;'

3 个答案:

答案 0 :(得分:1)

使用-00开关,您可以更改记录分隔符,并且(可能)将整个文件放在一行中,这样您就可以找到多行尾随逗号。但是,它也使print $_打印整行。你可能想要的是打印文件名:

print $ARGV if /,\s*[\]\}]/;

答案 1 :(得分:0)

其中大多数看起来像是解决问题的一个好方法,只有一个小问题。您可能需要,\s*(?:$|[\]\}])而不是,\s+(?:$|[\]\}]),因为可能没有一个空格。您的+量词可能会错过,]等表单。

话虽如此,JavaScript可能非常微妙,您可能会遇到评论和其他内容,这些内容可能会在意外发生之前以逗号结束,例如文件末尾或}。一个廉价的解决方案可能是使用perl s///表单在应用测试之前简单地删除所有注释。

如果您正在处理JSON,JSON :: XS可以使用其宽松选项强制执行有效性。

如果您需要真正的验证,可能就像JSLint一样。我使用Rhino嵌入JavaScript(使用Perl和SpiderMonkey稍微少一些)并使用它作为一组针对JavaScript代码的测试将是一个确保长期可靠性的好方法。

答案 2 :(得分:0)

解决此问题的一个简单方法是使用逗号优先样式。由于逗号永远不会出现在一行的末尾,因此永远不会有“尾随逗号”。

例如:

var myObj = { foo: 1
            , bar: 2
            , baz: 4
            }

您可以轻松检测是否缺少逗号,很明显哪些元素属于哪些大括号,并且从不存在“尾随逗号问题”。

另见https://gist.github.com/357981