И как такое переписать на C#
? Оно выдаёт нераспознанная escape-последовательность
, потому что есть бэкслеши.
Регулярки и так довольно замороченные, а тут такое наворотили
@"\b\s............."
не понял
а как это в переменную запихать?
string expression = @"\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(" +
"\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(";
выдаёт ту же ошибку
а, всмысле на каждую строку @
надо, а так он не понимает
При создании Regex regex = new Regex(expression);
, выдаёт экскепшен
System.ArgumentException: "выполняется разбор "\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(\bm=(?P<sig>[a-zA-Z0-9$]{2})\(decodeURIComponent\(h\.s\)\)\bc &&\(c=(?P<sig>[a-zA-Z0-9$]{2})\(decodeURIComponent\(c\)\)(?:\b|[^a-zA-Z0-9$])(?P<sig>[a-zA-Z0-9$]{2})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*"\s*\);[a-zA-Z0-9$]{2}\.[a-zA-Z0-9$]{2}\(a,\d+\)(?:\b|[^a-zA-Z0-9$])(?P<sig>[a-zA-Z0-9$]{2})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*"\s*\)(?P<sig>[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*"\s*\)(["\'])signature\1\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(\.sig\|\|(?P<sig>[a-zA-Z0-9$]+)\(yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*(?P<sig>[a-zA-Z0-9$]+)\(\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(\bc\s*&&\s*a\.set\([^,]+\s*,\s..." - Нераспознанная конструкция группирования."
Может там другой диалект регекспа.
Но вообще для начала стоит обратить внимание, что в Питоновском коде это не один большой регексп, а их список.
Что значит список? Там же, вроде, одна строка передаётся.
О, точно! Это же список Но тогда вообще не понятно, как он ищет
Получается, что ищет первое попавшееся совпадение по одному из паттернов?
Да, написано ж в описании функции.
А вот допустим, я вручную нашёл название нужной функции. Как ее выполнить через этот Jint
и получить от нее результат? В интернете в примерах они просто весь скрипт выполняют, а не отдельную функцию.
Там функция задаётся вручную и, затем, вызывается. А мне надо загрузить большой скачанный скрипт и из него выполнить функцию.
engine.Execute(@"myscript
myFunc();
");
то есть, как-то так?
Так говорю ж
You can invoke JavaScript function reference
var add = new Engine() .Execute("function add(a, b) { return a + b; }") .GetValue("add"); add.Invoke(1, 2); // -> 3
or directly by name
var engine = new Engine() .Execute("function add(a, b) { return a + b; }"); engine.Invoke("add", 1, 2); // -> 3
кстати,
var engine = new Engine().Execute(myText);
выдаёт экскепшен document is not defined
. Чё за документ?
myText
это большой скачанный скрипт. Я его в файл сохранил и из файла гружу.
document
это стандартная глобальная переменная в браузерном варианте JS.
Похоже Jint не поддерживает это (он ж не браузер), так что если оно нужно — надо искать другие варианты (Селениум как вариант). Надо посмотреть что оно с документом делает, по идее не должно ничего важного с ним делаться в этой функции ютуба, иначе бы и Питоновский вариант не работал.
У youtube-dl вообще просто свой небольшой выполнятор JS youtube-dl/jsinterp.py at master · ytdl-org/youtube-dl · GitHub
Эта функция, вроде, возвращает массив интегеров.