Выполнить код JavaScript

И как такое переписать на C#? Оно выдаёт нераспознанная escape-последовательность, потому что есть бэкслеши.
Регулярки и так довольно замороченные, а тут такое наворотили :scream:

@"\b\s............."

не понял :man_shrugging:

C @ не обрабатываются \.

https://dotnetfiddle.net/Z0VUXf

а как это в переменную запихать?

            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$]+)\(";

выдаёт ту же ошибку

Так тут нет у второй части.

https://dotnetfiddle.net/tyabj9

а, всмысле на каждую строку @ надо, а так он не понимает :man_shrugging:


теперь ему кавычка с бэкслешем не нравится :thinking: Теперь что делать?

"" внутри строк вместо ".

https://dotnetfiddle.net/d0cHHz

При создании 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..." - Нераспознанная конструкция группирования."

Может там другой диалект регекспа.

Но вообще для начала стоит обратить внимание, что в Питоновском коде это не один большой регексп, а их список.

Что значит список? :thinking: Там же, вроде, одна строка передаётся.
О, точно! Это же список :dizzy_face: Но тогда вообще не понятно, как он ищет :thinking:
Получается, что ищет первое попавшееся совпадение по одному из паттернов?

Да, написано ж в описании функции.

А вот допустим, я вручную нашёл название нужной функции. Как ее выполнить через этот Jint и получить от нее результат? :thinking: В интернете в примерах они просто весь скрипт выполняют, а не отдельную функцию.

Тут примеры с Invoke.

Там функция задаётся вручную и, затем, вызывается. А мне надо загрузить большой скачанный скрипт и из него выполнить функцию.

engine.Execute(@"myscript
 
    myFunc();
");

то есть, как-то так?

Так говорю ж

:arrow_down:

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. Чё за документ? :thinking:
myText это большой скачанный скрипт. Я его в файл сохранил и из файла гружу.

document это стандартная глобальная переменная в браузерном варианте JS.

Похоже Jint не поддерживает это (он ж не браузер), так что если оно нужно — надо искать другие варианты (Селениум как вариант). Надо посмотреть что оно с документом делает, по идее не должно ничего важного с ним делаться в этой функции ютуба, иначе бы и Питоновский вариант не работал.

У youtube-dl вообще просто свой небольшой выполнятор JS youtube-dl/jsinterp.py at master · ytdl-org/youtube-dl · GitHub

Эта функция, вроде, возвращает массив интегеров.