Командная строка Perl регулярное выражение, чтобы найти висячие запятые Javascript - PullRequest
2 голосов
/ 26 мая 2011

Здравствуйте, я ищу 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 ]

1 голос
/ 26 мая 2011

С помощью переключателя -00 вы меняете разделитель записей и (возможно) получаете весь файл в одну строку, что позволяет находить многострочные конечные запятые. Однако, это также заставляет print $_ печатать всю строку. Что вы, вероятно, хотите, это печать имени файла:

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

0 голосов
/ 28 мая 2011

Простым решением этой проблемы является использование стиля запятой.Поскольку запятые никогда не идут в конце строки, «запятой» никогда не бывает.

Например:

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

Вы можете легко определить, отсутствует ли запятая, это очевиднокакие элементы принадлежат к какому-либо набору фигурных скобок, и никогда не возникает «проблема запятой».

См. также https://gist.github.com/357981

0 голосов
/ 26 мая 2011

Большинство из них выглядят как достойный подход к проблеме, с одной небольшой проблемой. Вы, вероятно, хотите ,\s*(?:$|[\]\}]), а не ,\s+(?:$|[\]\}]), так как может не быть даже одного пробела. Ваш + квантификатор может пропустить такие формы, как ,].

Сказав это, JavaScript может быть довольно тонким, и вы вполне можете встретить комментарии и другие вещи, которые могут законно заканчиваться запятой перед чем-то неожиданным, таким как конец файла или }. Дешевым решением может быть использование формы perl s///, чтобы просто удалить все комментарии перед применением ваших тестов.

Если вы работаете с JSON, JSON :: XS может применить валидность с помощью его упрощенной опции.

Если вам нужна настоящая проверка, то, вероятно, стоит использовать что-то вроде JSLint. У меня был большой успех с использованием Rhino для встраивания JavaScript (чуть меньше с использованием Perl с SpiderMonkey), и использование этого в качестве набора тестов для кода JavaScript было бы хорошим способом обеспечения надежности во времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...