2011-05-26 21 views
2

你好我正在寻找一个Perl单线程,如果可能的话,扫描我们所有的Javascript文件,找到所谓的“流氓逗号”。也就是说,逗号出现在数组或对象数据结构的末尾,因此逗号紧接在']'或'}'之前。命令行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 $_;' 
+0

可能是服务器故障的好人选。 – 2011-05-26 14:40:28

+1

最后一个逗号有什么问题?这使得添加更多元素变得很容易。 – tchrist 2011-05-26 15:12:34

+0

也许你应该提一下为什么这些尝试不起作用。 – TLP 2011-05-26 15:31:49

回答

1

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

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

0

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

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

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

如果你需要real验证,像JSLint的东西可能是要走的路。使用Rhino嵌入JavaScript(在SpiderMonkey中使用Perl少一点),并且将其用作针对JavaScript代码的一组测试将是确保可靠性随时间推移的一种很好的方法。

0

一个简单的解决这个问题是使用逗号第一种样式。由于逗号不会排在最后,所以从不会有'尾随逗号'。

例如:

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

如果一个逗号缺失,您可以方便地检测,这是明显的哪些元素属于括号什么设置,并有一个永远“尾随逗号问题”。

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

+0

这是如何回答有关Perl正则表达式用于检测已存在于代码中的这类事情的问题? – 2011-05-30 10:19:20

+0

@George虽然提供技术上正确的问题答案很重要,但回答问题的意图也很重要。人们已经建议修复,所以我提出了一种替代方法。就像有人问:“我如何使用正则表达式解析HTML”或“当我把盐放在眼中时怎样才能阻止它受到伤害”,一个有用的答案是“不要那么做”。 – 2011-05-31 13:41:42

+0

我在这里,回到2年后,对我自己的问题使用了一个有用的答案,再次,你的“答案”是无益的。就好像我试图治愈一种疾病,你的答案是“避免疾病”。 – 2013-07-24 20:46:39