Regex: проблема с созданием подходящего шаблона - PullRequest
0 голосов
/ 27 февраля 2009

Возникли проблемы с поиском регулярного выражения для соответствия этому:

function Array() { [native code] }

Я пытаюсь сопоставить только текст, который будет встречаться там, где "Массив".

Ответы [ 3 ]

4 голосов
/ 27 февраля 2009

Вы пытаетесь выяснить, какой тип переменной в JavaScript? Если это то, что вам нужно, вы можете просто сравнить конструктор объекта с конструктором, который, по вашему мнению, его создал:

var array = new Array();
if(array.constructor == Array)
    alert("Is an array");
else
    alert("isn't an array");

Это на самом деле не лучший способ делать вещи в javascript. Javascript не имеет системы типов, подобной C #, которая гарантирует, что переменная будет иметь определенные члены, если она создана определенным конструктором, потому что javascript - это довольно динамические языки, и все, что объект получает от своего конструктора, может быть перезаписано во время выполнения.

Вместо этого действительно лучше использовать утку и спрашивать ваши объекты, что они могут сделать, а не то, чем они являются: http://en.wikipedia.org/wiki/Duck_typing

if(typeof(array.push) != "undefined")
{
    // do something with length
    alert("can push items onto variable");
}
3 голосов
/ 27 февраля 2009

В Perl вы бы использовали:

m/^\s*function\s+(\w+)\s*\(/;

Переменная '$1' будет содержать имя функции.

Если ключевое слово function может отсутствовать в начале строки, вам придется работать (немного) усерднее.

[Редактировать: добавлены две последовательности '\s*'.]


Вопрос о том, работает ли это ... вот мой тестовый пример:

Тестовый скрипт:

while (<>)
{
    print "$1\n" if (m/^\s*function\s+(\w+)\s*\(/);
}

Проверка строк ввода (да, намеренно смещено):

function Array() { ... }
 function   Array2   () { ... }
func Array(22) { ... }

Тестовый вывод:

Array
Array2

Протестировано с Perl 5.10.0 на Solaris 10 (SPARC): я не считаю платформу или версию существенным фактором - я ожидаю, что она будет работать так же на любой вероятной версии Perl.

0 голосов
/ 27 февраля 2009

Итак, впоследствии я получил это, которое почти работает:

[function\s]((\S+)+)(?=\(\))

Тем не менее, он все еще соответствует пробелу до массива

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