Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите составить регулярку для получения "private" переменных (https://javascript.ru/forum/misc/36745-pomogite-sostavit-regulyarku-dlya-polucheniya-private-peremennykh.html)

rgl 26.03.2013 19:04

Кажется, добил таки:
(["'])(?:\\.|(?:(?:(?!\1|\\).)))*\1

Уф-ф-ф, хорошо поразминался, а то уже подзабывать начал :-)

rgl 26.03.2013 19:35

Убрал лишние скобки:
(["'])(?:\\.|(?:(?!\1|\\).))*\1

kobezzza 26.03.2013 20:12

Цитата:

Сообщение от rgl (Сообщение 242798)
Убрал лишние скобки:
(["'])(?:\\.|(?:(?!\1|\\).))*\1

Респект:)

Цитата:

Уф-ф-ф, хорошо поразминался, а то уже подзабывать начал :-)
+1

devote 26.03.2013 21:39

Цитата:

Сообщение от rgl
Убрал лишние скобки:
(["'])(?:\\.|(?:(?!\1|\\).))*\1

не корректная у вас рега сударь, на моих примерах валится:

вот я вырезал регу со своего скрипта: https://github.com/devote/QSA/blob/master/qsa.js
var re = /(?:(['"])\1|(['"])(?:\\\\|[\s\S])*?(?:\\\\(?=\2)|[^\\])\2)/g;

var testText = 'привет "МИР"! тут я поставлю кавычку " а можно и слеши \\ или кавычка со слешами \\\" или кавычки " " или много слешей и ковычка \\\\\\\\\\\\\\\\" и" т.\\\\\\\\\\\\\\\\\\"д"......';

alert(testText.match(re).join("\n")); // выведет четыре подстроки

// ищем в коде все строки:
var code = "// for Internet Explorer VisualBasic Script accessors\
if (type !== 3) {\
    // create getter in VB Class\
    staticClassParts.push(\
        'Public ' + (type === 4 ? 'Default ' : '' ) + 'Property Get [' + subName + ']',\
        'Call VBCorrectVal(' + ( value && ( type !== 1 || value.get) ?\
            '[(accessors)].[' + prop + ']' + (type === 1 ? '.get' : '') +\
                '.call(me,[(accessors)].[' + prop + '])' : 'window.undefined' ) +\
            ',[' + subName + '])', 'End Property'\
    );\
}\
if (type !== 2) {\
    // create setter in VB Class\
    staticClassParts.push(\
        'Public Property Let [' + subName + '](val)',\
        type = (type === 4 ? 'Set [(accessors)].[' + prop + ']=val' :\
            value && (type !== 1 || value.set) ?\
                'Call [(accessors)].[' + prop + ']' + (type === 1 ? '.set' : '') +\
                    '.call(me,val,[(accessors)].[' + prop + '])' : '') +\
            '\nEnd Property', 'Public Property Set [' + subName + '](val)', type\
    );\
}";

alert(code.match(re).join("\n")); // выведет все найденные строки

Пользовательский тест:
var re = /(?:(['"])\1|(['"])(?:\\\\|[\s\S])*?(?:\\\\(?=\2)|[^\\])\2)/g;
var str = prompt('Введите строку') || '';
var res = str.match(re);
alert("Найдено: " + (res&&res.length||0) + " вхождени(е/й/я)\n--------------------------\n" + (res||[]).join("\n"));


Если нужно парсить код, то для начала, нужно удалить из кода все комменты, а потом искать строки.. Ну и про регулярки не забывать, в них тоже кавычки могут встретится:
<textarea id="area" style="width: 860px; height: 130px;" placeholder="вставь сюда JavaScript код и нажми кнопку process"></textarea>
<button onclick="process()">process</button>
<script>
    function process() {
        var rRemoveCommentsAndRexExp = /((['"])\2|(['"])(?:\\\\|[\s\S])*?(?:\\\\(?=\3)|[^\\])\3)|\/\*[\S\s]*?\*\/|\/[^\/](?:\\\\|[\s\S])*?(?:\\\\(?=\/)|[^\\])\/|\/\/[^\n]*/g;
        var rSearchStrings = /(?:(['"])\1|(['"])(?:\\\\|[\s\S])*?(?:\\\\(?=\2)|[^\\])\2)/g;
        var value = document.getElementById('area').value;
        var str = value.replace(rRemoveCommentsAndRexExp, '$1');
        var res = str.match(rSearchStrings);
        alert("Найдено: " + (res&&res.length||0) + " вхождени(е/й/я)\n--------------------------\n" + (res||[]).join("\n"));
    }
</script>

devote 26.03.2013 21:50

поправил выше код, со слешами не правильно работала рега. Терь гуд

rgl 27.03.2013 10:23

Цитата:

Сообщение от devote
не корректная у вас рега сударь, на моих примерах валится:

Что конкретно не так? Пример строки, и что по вашему мнению нужно найти. В вашем примере находит 4 подстроки, как и надо, т.е. все работает правильно.

devote 27.03.2013 10:26

Цитата:

Сообщение от rgl
Что конкретно не так?

вы проверьте сами
Цитата:

Сообщение от rgl
В вашем примере находит 4 подстроки, как и надо, т.е. все работает правильно.

ну дык я бы и не выкладывал бы свой пример, если бы он не работал

rgl 27.03.2013 10:40

Что не так??
var testText = 'привет "МИР"! тут я поставлю кавычку " а можно и слеши \\ или кавычка со слешами \\\" или кавычки " " или много слешей и ковычка \\\\\\\\\\\\\\\\" и" т.\\\\\\\\\\\\\\\\\\"д"......';
var re = /(["'])(?:\\.|(?:(?!\1|\\).))*\1/g;
alert( testText.match(re).join("\n") );

devote 27.03.2013 11:02

Цитата:

Сообщение от rgl
Что не так??

var str = 'привет "МИР"! тут я поставлю кавычку " а можно и\n слеши \\ или кавычка со слешами \\" или кавычки " " или много\n слешей и ковычка \\\\\\\\\\\\\\\\" и" т.\\\\\\\\\\\\\\\\\\"д"......';

var re = /(["'])(?:\\.|(?:(?!\1|\\).))*\1/g;
var res = str.match(re);
alert("Найдено: " + (res&&res.length||0) + " вхождени(е/й/я)\n--------------------------\n" + (res||[]).join("\n"));


// ----------
var re = /(?:(['"])\1|(['"])(?:\\\\|[\s\S])*?(?:\\\\(?=\2)|[^\\])\2)/g;
var res = str.match(re);
alert("Найдено: " + (res&&res.length||0) + " вхождени(е/й/я)\n--------------------------\n" + (res||[]).join("\n"));

rgl 27.03.2013 11:04

А вот ваша рега как раз ошибается, находит там, где находить не должна (ошибочно замаскированную кавычку принимает за закрывающую):
var testText = "a'b\\\\\\'c"
var re = /(?:(['"])\1|(['"])(?:\\\\|[\s\S])*?(?:\\\\(?=\2)|[^\\])\2)/g;
alert( testText.match(re).join("\n") );


Часовой пояс GMT +3, время: 03:20.