Cần giúp đỡ regex

Mình có đoạn string sau cần regex bằng c#:

//<![CDATA[
  (function(){
    var a = function() {try{return !!window.addEventListener} catch(e) {return !1} },
    b = function(b, c) {a() ? document.addEventListener("DOMContentLoaded", b, c) : document.attachEvent("onreadystatechange", b)};
    b(function(){
      var a = document.getElementById('cf-content');a.style.display = 'block';
      setTimeout(function(){
        var s,t,o,p,b,r,e,a,k,i,n,g,f, WrxdrAA={"jKh":+((!+[]+!![]+[])+(+[]))};
        t = document.createElement('div');
        t.innerHTML="<a href='/'>x</a>";
        t = t.firstChild.href;r = t.match(/https?:\/\//)[0];
        t = t.substr(r.length); t = t.substr(0,t.length-1);
        a = document.getElementById('jschl-answer');
        f = document.getElementById('challenge-form');
        ;WrxdrAA.jKh-=+((!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));WrxdrAA.jKh*=+((+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]));WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));WrxdrAA.jKh-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=!+[]+!![]+!![]+!![]+!![]+!![];WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));a.value = parseInt(WrxdrAA.jKh, 10) + t.length; '; 121'
        f.submit();
      }, 4000);
    }, false);
  })();
  //]]>

Chuỗi cần lấy sau khi regex:

var s,t,o,p,b,r,e,a,k,i,n,g,f, WrxdrAA={"jKh":+((!+[]+!![]+[])+(+[]))};
t='demo',a='demo'
WrxdrAA.jKh-=+((!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));WrxdrAA.jKh*=+((+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]));WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));WrxdrAA.jKh-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=!+[]+!![]+!![]+!![]+!![]+!![];WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));a.value = parseInt(WrxdrAA.jKh, 10) + t.length;

Đừng có lấy regex mà đi parse code, chẳng đi về đâu được đâu, lại còn khó bảo trì nữa, đây là javascript, vậy bạn nên tìm thư viện xử lý javascript trên C#, giới thiệu cho bạn 2 thư viện rất tốt:

Chính xác là 2 lib này đổi từ Javascript sang cấu trúc AST (https://vi.wikipedia.org/wiki/Cây_cú_pháp_trừu_tượng)

Code để parse bên Jint:

var scriptString = @"console.log(""Hello world"");";
var parser = new Jint.Parser.JavaScriptParser();
var program = parser.Parse(scriptString, new Jint.Parser.ParserOptions { Tokens = true });
// truy cập vào program để lấy đúng Statement, hình như có 1 property của nó cho phép lấy đoạn code, mình ít dùng cái này nên không rõ

Code để parse bên Nil.JS (phân tích cấu trúc dữ liệu của nó khá là dài, nên mình bày bạn cách gọi lệnh parse thôi):

using NiL.JS;
using NiL.JS.Core;
using NiL.JS.BaseLibrary;
using NiL.JS.Statements;
namespace ParseJS
{
   static class Experiment
   {
      public static void Run()
      {
         // mình sửa lại theo lời của của bác tác giả lib này
         var scriptString = @"console.log(""Hello world"");";
         var module = new Module(scriptString);
         var astRoot = module.Root;
         // truy cập vào trong astRoot để xử lý và lấy lệnh mình cần, tìm được Statement đúng rồi thì có thể dùng ToString() để lấy nó ra
      }
   }
}

1 Like

Cảm ơn bạn đã giải thích.
Tớ regex đoạn đó để cho vào Jint mà.
Sau khi regex được đoạn:

var s,t,o,p,b,r,e,a,k,i,n,g,f, WrxdrAA={"jKh":+((!+[]+!![]+[])+(+[]))};
t='demo',a='demo'
WrxdrAA.jKh-=+((!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));WrxdrAA.jKh*=+((+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]));WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));WrxdrAA.jKh-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=!+[]+!![]+!![]+!![]+!![]+!![];WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));a.value = parseInt(WrxdrAA.jKh, 10) + t.length;

Thì cho vào jint nó sẽ ra kết quả luôn.
Jint không chạy được các lệnh:

t = document.createElement('div');
t.innerHTML="<a href='/'>x</a>"; 
... 

nên tớ mới muốn regex xoá hết đoạn này đi mà?

Bạn có skype không cho tớ hỏi chút :slight_smile:

1 Like

Do not use Tools.RemoveComments (NiL.JS) directly. This method stops processing after char ‘/’ and returns only part of code. If you want to get AST see Module.Root. It is root of AST.

2 Likes

Thanks, I have edited my post :slight_smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?