2011-05-26 32 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