Generator Auto Regex - similaritate între 2 șiruri de caractere c #

Încerc să creez un generator de regex pentru scopuri de dezmembrare și orice apreciere este apreciată.

Ideea este că avem un text mare (html), vom selecta 2 (cel puțin) elemente DOM care sunt întotdeauna similare (cum ar fi primele 2 rezultate de la Google) și decât ar trebui să generăm o expresie regulată care să riște (se potrivesc) rezultate.

Exemplu: Elementul selectat 1 (acesta va fi introdus de un utilizator):

Games at Miniclip.com - Play Free Online Games

Elementul selectat 2 (acesta va fi introdus de un utilizator):

Games.com: Play Games Online - Free Games, Download Games ...

Text HTML care conține ambele elemente:

    <!--m-->
  1. <div sig="U8P" bved="0CBUQkQo" pved="0CBQQkgowAA" class="vsc">

    Games at Miniclip.com - Play Free Online Games

    <div class="vspib" aria-label="Detalii rezultat" role="button" tabindex="0"> </div></div></div><!--n-->
  2. <!--m-->
  3. <div sig="fUe" bved="0CBsQkQo" pved="0CBoQkgowAQ" class="vsc">

    Games.com: Play Games Online - Free Games, Download Games ...

    <div class="vspib" aria-label="Detalii rezultat" role="button" tabindex="0">

    In this case, the good regex would be:

    (

    )(.*?)(

    <div)
    

    Not to hard to figure out. The problem appears when

    appears in another element that is not related to our results. For example if you add:

    THIS IS JUST AN EXTRA THING

     
    

    at start of the HTML text, the regex from above would not work.

    The new regex would need to be:

    (class="vsc">

    )(.*?)(

    <div)
    

    I know this is not an easy thing to acheieve, but my idea is to find the similarities of the elements (for example take 100 characters before and after the elements and see what are identical for element 1/element 2).

    Hope somebody can guide me on what would be the best way to achieve this.

    Thanks in advance

1
Doar pentru a oferi mai multe detalii pentru o posibilă soluție. Am încercat să pun în aplicare un algoritm DIFF. Iau 2 elemente care au modele similare, copiați 50 de caractere înainte și după ambele elemente, comparați diferențele și creați regex.
adăugat autor BlasterGod, sursa
Știu că există o cercetare întreagă. Aceasta nu este o problemă simplă. Cred că a fost făcut într-un add-on plătite pentru Excel.
adăugat autor nhahtdh, sursa
Se pare că problema reală pe care încercați să o rezolvați este: "Având în vedere o pagină web, găsiți orice secvență de etichete repetate, care ar putea fi o listă de date". Probabil Regex nu este răspunsul. Poate un fel de autocorelație (în sens DSP) pe etichete?
adăugat autor Li-aung Yip, sursa

1 răspunsuri

Dacă înțeleg corect întrebarea, primul lucru de care aveți nevoie este ceva care întoarce o expresie regulată care se potrivește optim unui anumit șir, având în vedere șirul (și un anumit context). Se pare că există câteva opțiuni acolo, inclusiv Regulazy și txt2re .

Următorul lucru de care aveți nevoie este abilitatea de a traversa DOM-ul, deoarece căutați un părinte (de exemplu, da 2 link-uri în exemplul dvs. pe care doriți să-l găsiți în jurul h3). Puteți încerca să faceți acest lucru prin regex, dar va fi dificil și, probabil, nu veți rezolva în mod corespunzător toate cazurile de margine. Există tot felul de instrumente disponibile atât pentru fixarea codului HTML compatibil non-XML, cât și pentru traversarea DOM-ului rezultat, de exemplu, am făcut acest lucru în Java a doua zi utilizând NekoHTML .

În acel moment puteți aplica un algoritm, după cum urmează:

  1. Găsiți primul părinte obișnuit între cele două noduri date.
  2. Construiește o expresie regulată din conținutul textului părintelui.
  3. Aplicați regexul la conținutul nodului html de nivel superior.
  4. Dacă obțineți mai mult de 1 potrivire (cazul dublu h3) micșorați la părintele părintelui.
  5. Clătiți și repetați, începând cu pasul 2 cu noul părinte.

Sosul secret este în mod clar în modul în care generați regexul de la șir, dar se pare că vă puteți baza pe anumite instrumente de terță parte pentru acea porție. În esență, ceea ce faceți este să creați un șir de compilatoare pentru regex, deci dacă aveți nevoie să implementați acest lucru de la zero, o abordare poate fi tokenizing șirul și construirea unui Rezumat Sintaxă Arbore . Puteți apoi să vizitați nodurile AST pentru a rula optimizări (de exemplu, căutarea unor noduri consecutive duplicate care pot fi înlocuit cu operatori regex */+), și apoi într-o vizită finală generează regex.

La un nivel mai înalt, poate doriți să vă gândiți dacă expresiile regulate sunt într-adevăr răspunsul corect pentru problema dvs. Dacă doriți doar să găsiți linkuri pe Google, oferindu-vă câteva exemple, puteți trece probabil DOM pentru a căuta părintele și apoi apuca toți copiii care sunt linkuri.

0
adăugat