REGPATH - sintaksa za selektiranje foldera i fileova

Kako vam se čini sljedeća sintaksa za filtriranje file-ova… i ako postoji već neka normirana, rado bi čuo koja.

Ideja je znači da se može fleksibilno i jednostavno filtrirati skup putanja prema file-ovima (pathova) po različitim kriterijima.

//REGPATH - nam omogućava da na lak način filtriramo putanje/pahtove

*  -> dohvaća bilo koji file/folder
*/ -> dohvaća samo foldere

*.txt                 -> dohvaća bilo koji txt file na bilo kojoj razini
script.*              -> dohvaća sve script fileove, bilo koje ekstenzije na bilo kojoj razini
*script.*             -> dohvaća sve fileove koji završavaju sa script, bilo koje ekstenzije na bilo kojoj razini
script*.*             -> dohvaća sve fileove koji počinju sa script, bilo koje ekstenzije na bilo kojoj razini
*script*.*            -> dohvaća sve fileove koji sadrže script, bilo koje ekstenzije na bilo kojoj razini
*sc*pt*.*             -> dohvaća sve fileove koji sadrže pt nakon sc, bilo koje ekstenzije na bilo kojoj razini

*/*.txt            -> dohvaća sve .txt fileove na bilo kojoj dubini
*{0}/*.txt         -> dohvaća sve .txt fileove na nultoj razini
! gornji zapis se može zapisati jednostavnije kao:  "{0}/*.txt"       
{1-3}/*.txt       -> dohvaća sve .txt fileove na dubini 1 i 2.        
{1+}/*.txt        -> dohvaća sve .txt fileove na dubini 1 ili većoj.

folderA/*          -> dohvaća sve što je se nalazi u folderu "folderA" koji mora biti na nultoj razini
folderA/*.txt      -> dohvaća sve .txt file-ove u "folderA" koji mora biti na nultoj razini

*/folderA/*         -> dohvaća sve što se nalazi na bilo kojoj dubini u folderu "folderA" koji također može biti na bilo kojoj razini
folderA/*.txt       -> dohvaća sve .txt file-ove u "folderA"
folderA/*/*.txt     -> dohvaća sve .txt file-ove koji se nalaze na bilo kojoj dubini unutar "folderA"
folderA/{1-4}/*.txt -> dohvaća sve .txt file-ove koji se nalaze unutar prve četiri razine unutar "folderA"
folderA/*/          -> dohvaća sve foldere koji se nalaze na bilo kojoj dubini unutar "folderA"
folderA/{1}/        -> dohvaća sve foldere koji se nalaze u folderu "folderA"

//Excluder: 
-*.txt              -> NE dohvaća bilo koji txt file na bilo kojoj razini. Analogno ovome, predznak minus se može dodati na bilo koji selektor da bi dobili Excluder

//Regex:
!.*\/file\d\.txt   -> ako izraz počinje sa !, onda se cijeli izraz komparira po regex searchu. Tako će ovaj selektor obuhvatiti sve fileove na bilo kojoj dubini koji u nazivu imaju broj, tipa: "file1.txt"

//Regex and Exluder
-!file\\d/.+\\.txt 

//Partial regex. - omogućava da mixamo nativna pravila regpatha sa regex pravilima. Možemo bilo koju path sekciju označiti sa početnim "!" i ta sekcija će se testirati po regex pravilima.
path/to/!folder[ABC]/*    -> dohvaća sve što je na putanjama "path/to/folderA", "path/to/folderB" ili "path/to/folderC" 
      // !Kod partial regexa je zabranjeno koristiti karakter "/" unutar one sekcije koju označavamo sa "!" ...tako je npr syntax error ako se zada selektor: "path/to/folder[ABC\/]/*" 

Bit će mi drago čuti bilo kakvu sugestiju za sintaksu…ako nešto fali ili bi trebalo bolje konceptirati :wink:

I jedan zanimljiv success. Napisao sam cijeli code za ovaj filter bez iti jednog refresha da išta testiram.
Nakon jedno dva-tri sata pisanja code-a…sve radilo po špagi. Par sitnica zaglavilo. :slight_smile:
Inače nikada ne tipkam satima bez probanja…prije bi rekao da probam nešto svake minute po nekoliko puta xd.

Šta podrazumijevaš nultom razinom?

Neka su putanje koje filtriramo:
file.txt
folderA/fileA.txt
folderA/folderB/fileB.txt

Znači, file.txt se nalazi na nultoj razini.
… fileA.txt na prvoj…itd.

Te putanje su uvijek relativne u odnosu na nešto… ali to filtar ne zanima… on ih vidi onakve kakve su prosljeđene u filtar.

Znači current directory?

Ne baš …trenutni direktorij implicira da se negdje nalazimo…i to je promjenjiva varijabla kako mijenjamo svoju poziciju. Ovdje se ne mora raditi o trenutnom direktoriju.

Recimo primjena gornje sintakse, neka imamo sljedeći skup putanja koje želimo filtrirati:

basic.css
CROSS/account_maker/account/login.css
CROSS/account_maker/account/login.js
CROSS/account_maker/account/loginBlock.php
CROSS/account_maker/account/loginOption.php
CROSS/account_maker/account/parametars.php
CROSS/account_maker/deleted/change_mail_old.php
CROSS/account_maker/deleted/ident_old_version.php
CROSS/account_maker/how to use.txt
CROSS/account_maker/ident.php
CROSS/account_maker/identifikacijaKorisnikaPrekoKukija.php
CROSS/account_maker/identifikacijaKorisnikaZaAjax.php
CROSS/account_maker/identOLD.php
CROSS/account_maker/loginOption.php
CROSS/account_maker/logout.php
CROSS/account_maker/manageUser.php
CROSS/account_maker/old__now in account/login.css
CROSS/account_maker/old__now in account/loginBlock.php
CROSS/account_maker/old__now in account/loginJS.js
CROSS/account_maker/old__now in account/loginOption.php
CROSS/account_maker/old__now in account/parametars.php
CROSS/ajax/ban.php
CROSS/ajax/bench.php
CROSS/ajax/bframework_setup.php
CROSS/ajax/bgallery.php
CROSS/ajax/bupitnik.php
CROSS/ajax/databaseBench.php
CROSS/ajax/fileManager.php
CROSS/ajax/getTemplate.php
CROSS/ajax/kontrola_pristupa.php
CROSS/ajax/manage_fb_tokens.php
CROSS/ajax/manyOption.php
CROSS/ajax/proba.php
CROSS/ajax/scopeTemplates.php
CROSS/ajax/setCookie.php
CROSS/ajax/setFullPagesNames.php
CROSS/ajax/warning.php
CROSS/BACKWARD CHANGES.txt
CROSS/BArrow/BArrow.js
CROSS/bBug/bBug.css
CROSS/bBug/bBug_core.js
CROSS/bBug/help.txt
CROSS/bBug/test/test1.txt
CROSS/bBug/test/test2.php
CROSS/bCanvas/bCanvas.js
CROSS/bCanvas/html/camController.php
CROSS/bCanvas/stackBlur.js
CROSS/BCard/BCard.css
CROSS/BCard/BCard.js
CROSS/BCheck/BCheck.css
CROSS/BCheck/BCheck.js
CROSS/BCheck/btns.psd
CROSS/BClass/BClass.js
CROSS/BDatum/BDatum.css
CROSS/BDatum/BDatum.js
CROSS/Beditor/beditor.css
CROSS/Beditor/beditor.js
CROSS/bgallery/bgallery.css
CROSS/bgallery/bgallery.js
CROSS/BGroup/BGroup.js
CROSS/Bnavigation/bnavigation.js
CROSS/BOption/BOption.css
CROSS/BOption/BOption.js
CROSS/BPager/BPager.js
CROSS/BPopUp/BPopUp.css
CROSS/BPopUp/BPopUp.js
CROSS/BSS_compailer/bss_compailer.php
CROSS/CCA/bframework-externs.js
CROSS/CCA/jQuery-externs-repair.js
CROSS/colorpicker/css/colorpicker.css
CROSS/colorpicker/css/layout.css
CROSS/colorpicker/images/blank.gif
CROSS/colorpicker/images/colorpicker_indic.gif
CROSS/colorpicker/images/colorpicker_select.gif
CROSS/colorpicker/images/custom_indic.gif
CROSS/colorpicker/images/Thumbs.db
CROSS/colorpicker/js/colorpicker.js
CROSS/colorpicker/js/eye.js
CROSS/colorpicker/js/layout.js
CROSS/colorpicker/js/utils.js
CROSS/colorpicker/myHelp.txt
CROSS/controllers/ajaxController_crossProject.php
CROSS/controllers/bIniterCore.php
CROSS/controllers/frontController_crossProject.php
CROSS/controllers/initialConfiguration.php
CROSS/controllers/initialModel_crossProject.php
CROSS/cookie_graph.txt
CROSS/css/animBar.bss
CROSS/css/bUI_test.bss
CROSS/css/bUI_test.css
CROSS/css/bUI_test_M.css
CROSS/css/camController.css
CROSS/css/customCheckbox.css
CROSS/css/dialog_and_popUps_M.css
CROSS/css/font-awesome.css
CROSS/css/icomoon.css
CROSS/css/jQuery-ui-UPUPTE.txt
CROSS/css/jQuery-ui_1_11_4.css
CROSS/css/media_screen_label.css
CROSS/css/SASS_compiled/animBar.scss
CROSS/css/SASS_compiled/bUI_test.scss
CROSS/css/SASS_compiled/bUI_test_M.scss
CROSS/css/SASS_compiled/sass_mixins.scss
CROSS/css/SASS_compiled/styleBasic.scss
CROSS/css/sass_mixins.bss
CROSS/css/styleBasic.bss
CROSS/css/styleBasic.css
CROSS/css/styleBasic_with_bss.css
CROSS/css/styleInitBasic.css
CROSS/css/tinymce.css
CROSS/editableText/bTiny.js
CROSS/editableText/editableText.js
CROSS/geoIP/geo.inc
CROSS/geoIP/GeoIP.dat
CROSS/geoIP/help.txt
CROSS/HELP/my example.php
CROSS/HELP/reg_exp_upute.txt
CROSS/html/body.php
CROSS/html/content_dont_exists.php
CROSS/html/develop_access.php
CROSS/html/emptyContent.php
CROSS/html/emptyContentWarning.php
CROSS/html/errorFrame.php
CROSS/html/head.php
CROSS/html/media_screen_label.php
CROSS/html/openHTML.php
CROSS/html/templates/bgallery.php
CROSS/html/templates/dialog.php
CROSS/html/templates/dialogChoice.php
CROSS/html/templates/dialogPrompt.php
CROSS/html/templates/fileUploader.php
CROSS/html/templates/formTemplates.php
CROSS/html/templates/mobile_popup.php
CROSS/html/templates/photoswipe.php
CROSS/html/templates/povratak_na_vrh.php
CROSS/js/addMoreOptions.js
CROSS/js/ads.js
CROSS/js/autoFitArea.js
CROSS/js/basic-copy.js
CROSS/js/basic.js
CROSS/js/basicOld.js
CROSS/js/basic_zakrpa.js
CROSS/js/bDevelopTools.js
CROSS/js/beasy_typing.js
CROSS/js/bozoou_basic.js
CROSS/js/bRandom.js
CROSS/js/btemplate.js
CROSS/js/bTitle.js
CROSS/js/bUpitnik.js
CROSS/js/develop_access.js
CROSS/js/dialogPrompt.js
CROSS/js/dialog_checkboxer.js
CROSS/js/drag_and_drop.js
CROSS/js/fbApi.js
CROSS/js/fileManager.js
CROSS/js/fileUploader.js
CROSS/js/generated_css.js
CROSS/js/googleMap.js
CROSS/js/lightInfo.js
CROSS/js/lightInfo_LS.js
CROSS/js/my_photoswipe.js
CROSS/js/onload_cross_project.js
CROSS/js/permissionManager.js
CROSS/js/popUp.js
CROSS/js/projectExporter.js
CROSS/js/social_share.js
CROSS/js/textarea_selection_manipulator.js
CROSS/js/toBS.js
CROSS/js/whiteEditor.js
CROSS/kontrola_pristupa/help.txt
CROSS/kontrola_pristupa/kp_project.php
CROSS/myInput/myInput.css
CROSS/myInput/myInput.js
CROSS/myTitle/img/Thumbs.db
CROSS/myTitle/myTitle.css
CROSS/myTitle/myTitle.js
CROSS/parametars/fileUploader_parametars.php
CROSS/php/classes/ban.php
CROSS/php/classes/bgallery.php
CROSS/php/classes/browser.php
CROSS/php/classes/browser_p.php
CROSS/php/classes/btest.php
CROSS/php/classes/bTranslator.php
CROSS/php/classes/bupitnik.php
CROSS/php/classes/cacher.php
CROSS/php/classes/classproba.php
CROSS/php/classes/cleanCirilica.php
CROSS/php/classes/closure_compressor.php
CROSS/php/classes/closure_compressor_advance.php
CROSS/php/classes/code_analize.php
CROSS/php/classes/county.php
CROSS/php/classes/croneJob.php
CROSS/php/classes/cross_login.php
CROSS/php/classes/database.php
CROSS/php/classes/date.php
CROSS/php/classes/db.php
CROSS/php/classes/dblist.php
CROSS/php/classes/dbs.php
CROSS/php/classes/dbTranslator.php
CROSS/php/classes/deleted/account.php
CROSS/php/classes/email.php
CROSS/php/classes/evalclass.php
CROSS/php/classes/fbApi.php
CROSS/php/classes/fileManager.php
CROSS/php/classes/fileUploader.php
CROSS/php/classes/fileVar.php
CROSS/php/classes/form.php
CROSS/php/classes/googleMap.php
CROSS/php/classes/googleTranslate.php
CROSS/php/classes/google_recaptcha.php
CROSS/php/classes/html/form.php
CROSS/php/classes/html/input.php
CROSS/php/classes/ident.php
CROSS/php/classes/identity.php
CROSS/php/classes/image.php
CROSS/php/classes/includeGraph.php
CROSS/php/classes/komentar.php
CROSS/php/classes/kp.php
CROSS/php/classes/kp_project.php
CROSS/php/classes/light_info_data.php
CROSS/php/classes/locatorIP.php
CROSS/php/classes/manageArray.php
CROSS/php/classes/manage_user.php
CROSS/php/classes/ml.php
CROSS/php/classes/myPDO.php
CROSS/php/classes/noMoreTempFile.php
CROSS/php/classes/novice.php
CROSS/php/classes/online_directive.php
CROSS/php/classes/pageGraph.php
CROSS/php/classes/phml.php
CROSS/php/classes/project_exporter.php
CROSS/php/classes/protocolLog.php
CROSS/php/classes/replacer.php
CROSS/php/classes/reporter.php
CROSS/php/classes/sass.php
CROSS/php/classes/scriptGenerator.php
CROSS/php/classes/serverStorage.php
CROSS/php/classes/sessioner.php
CROSS/php/classes/sitemaper.php
CROSS/php/classes/sql.php
CROSS/php/classes/statistic_log.php
CROSS/php/classes/template.php
CROSS/php/classes/templateIncluder.php
CROSS/php/classes/test.php
CROSS/php/classes/testClass.php
CROSS/php/classes/token.php
CROSS/php/classes/trace.php
CROSS/php/classes/translator.php
CROSS/php/classes/uniqID.php
CROSS/php/classes/validator.php
CROSS/php/classes/visitAnalitik.php
CROSS/php/classes/warning.php
CROSS/php/classes/warning_p.php
CROSS/php/classes/work.php
CROSS/php/classes/zipper.php
CROSS/php/classes/__template_class.php
CROSS/php/default/basicPHP.php
CROSS/php/default/bss_compailer.php
CROSS/php/default/connectDataBase.php
CROSS/php/default/CrossCore.php
CROSS/php/default/initRoute.php
CROSS/php/default/kontrolaGreski.php
CROSS/php/default/makeBasicTable.dbs
CROSS/php/default/makeBasicTable.php
CROSS/php/deleted/basicPHP_deleted.php
CROSS/php/functions/download_txt_file.php
CROSS/php/functions/manage_all_field.php
CROSS/php/functions/noMoreTempFile.php
CROSS/php/repair_modules/convertDatabase_to_UTF8.php
CROSS/php/tests/cross-unitTesting.php
CROSS/SQL_basic.php
CROSS/__CHANGE_LOG__/change_log_backward_NO_compability.txt
CROSS/modernUpload/uploadForm.js
CROSS/PHPMailer/myMailForm.php
app/tools/testtool/classes/a_blankclass.php
app/tools/testtool/customView3.phml
app/tools/testtool/pages/page1/page1_m.php
app/tools/testtool/pages/page1/page1_w.phml
app/tools/testtool/pages/page2/css_level_0.css
app/tools/testtool/pages/page2/customModel1.php
app/tools/testtool/pages/page2/customModel2.php
app/tools/testtool/pages/page2/js_level_0.js
app/tools/testtool/pages/page2/subpage1/css_level_1.css
app/tools/testtool/pages/page2/subpage1/js_level_1.js
app/tools/testtool/pages/page2/subpage1/page2/subpage1_m.php
app/tools/testtool/pages/page2/subpage1/subpage1_m.php
app/tools/testtool/pages/page2/subpage1/subpage21/subpageView21.php
app/tools/testtool/pages/page2/subpage1/subpageView.phml
app/tools/testtool/php_classes/about.txt
app/tools/testtool/testtool_layout1.phml
app/tools/testtool/testtool_layout2.phml
app/tools/testtool/testtool_wep.js
app/tools/testy-fordelete/pages/page1/page1_m.php
app/tools/testy-fordelete/pages/page1/page1_w.phml
app/tools/testy-fordelete/php_classes/about.txt
dist/index.output.a53354ec3a4351b30898.js
dist/login.output.a53354ec3a4351b30898.js
dist/main.output.a53354ec3a4351b30898.js
dist/test.output.a53354ec3a4351b30898.js
dist/test1.output.a53354ec3a4351b30898.js
dist/test2.output.a53354ec3a4351b30898.js
dist/tool_barcodescanner.output.a53354ec3a4351b30898.js
dist/tool_tamanager.output.a53354ec3a4351b30898.js
dist/tool_testtool.output.a53354ec3a4351b30898.js
dist/vendors~index.output.a53354ec3a4351b30898.js
dist/vendors~index~login~main~test~test1~test2~tool_barcodescanner~tool_tamanager~tool_testtool.output.a53354ec3a4351b30898.js
dist/vendors~index~login~main~test~tool_barcodescanner~tool_tamanager.output.a53354ec3a4351b30898.js
dist/vendors~index~login~main~test~tool_tamanager.output.a53354ec3a4351b30898.js
dist/vendors~index~login~test~tool_tamanager.output.a53354ec3a4351b30898.js
dist/vendors~tool_barcodescanner.output.a53354ec3a4351b30898.js
semantic/dist/components/accordion.css
semantic/dist/components/accordion.js
semantic/dist/components/accordion.min.css
semantic/dist/components/ad.css
semantic/dist/components/ad.min.css
semantic/dist/components/api.js
semantic/dist/semantic.css
semantic/dist/semantic.js
semantic/dist/semantic.min.css
semantic/gulpfile.js
semantic/src/definitions/behaviors/api.js
semantic/src/definitions/behaviors/form.js
semantic/src/definitions/behaviors/visibility.js
semantic/src/definitions/collections/breadcrumb.less
semantic/src/definitions/collections/form.less
semantic/src/definitions/collections/grid.less
semantic/src/definitions/collections/menu.less
semantic/src/definitions/collections/message.less
semantic/src/definitions/collections/table.less
semantic/tasks/admin/components/create.js
semantic/tasks/admin/components/init.js
semantic/tasks/admin/components/update.js
semantic/tasks/admin/distributions/create.js
semantic/tasks/admin/distributions/init.js
semantic/tasks/admin/distributions/update.js
semantic/tasks/admin/publish.js
semantic/tasks/admin/register.js
semantic/tasks/admin/release.js
semantic/tasks/build/assets.js
semantic/tasks/build/css.js
semantic/tasks/build/javascript.js
semantic/tasks/build.js
semantic/tasks/check-install.js
semantic/tasks/clean.js
semantic/tasks/collections/admin.js
semantic/tasks/collections/build.js
semantic/tasks/collections/internal.js
semantic/tasks/collections/README.md
semantic/tasks/collections/rtl.js
semantic/tasks/config/admin/github.js
semantic.json
system_files/webpack_chunks_map.php
system_files/_myHelp.txt
templates_script/tool_default_phml_view.phml
templates_script/tool_default_php_view.php
templates_script/tool_wep_template.js
webpack_dry_import/webpack_dry_import_1.js
webpack_dry_import/webpack_dry_import_globalne_varijable.js
webpack_dry_import/webpack_dry_import_test.js
webpack_dry_import/_myHelp.txt
webpack.common.js
webpack.dev.js
webpack.prod.js

Zadatak je filtrirati gornje fileove, to će odrađivati metoda koja se zove tipa:
pathFilter($paths, $fitlers)
Znači ta metoda prima listu pathova isto kao i listu filtera…te nam vraća samo one pathove koji ispunjavaju zadane filtere. No ovdje je riječ o sintaksi filtera…kako će je netko implementirati u svoje metode, može biti varijabilno.

Recimo da imamo sljedeće potrebe za filtiranje gornjih pathova:

  1. Dohvatiti sve css fileove:
    Sintaksa filtera: “*.css
    Dohvatit će sve .css fileove sa bilo koje razine

  2. Dohvatiti sve css fileove sa nulte razine:
    Sintaksa filtera: “{0}/*.css
    Dohvatit će samo file: basic.css

  3. Dohvatiti sve css fileove koji se nalaze na trećoj ili većoj razini:
    Sintaksa filtera: “{3+}/*.css

  4. Dohvatiti sve “accordion” fileove koji se nalaze u semantic folderu na bilo kojoj dubini, a koji nisu .js fileovi:
    Sintaksa filtera:
    semantic/*/accordion.*
    -semantic/*/accordion.js

    Znači ovdje koristimo exluder. Prvi filter je opisao koji sve file-ovi se obuhvaćaju regexom, a drugi koje sve excludamo (Predznak minus). Tako da zbrojem ta dva filtera dobivamo traženi presjek. (Uvijek zadnji filter u listi koji matcha neki path utječe hoće li file biti includan ili excludan, ali to je već logika koja je ugrađena u engine koji koristi ovu sintaksu, te nije direktno vezano uz samu sintaksu pojedinog filtera.)
    Zvjezdica nakon semantic označava da accordion file može biti na bilo kojoj dubini unutar foldera semantic.
    S obzirom na gornju listu pathova, dohvaćeno bi bilo:

semantic/dist/components/accordion.css
semantic/dist/components/accordion.min.css
  1. Dohvati sve .js fileove koji se nalaze u src folderu, gdje taj src može biti na bilo kojoj razini…te file.js može biti na bilo kojoj razini unutar src foldera:
    Sintaksa filtera: “*/src/*/*.js

  2. Dohvati sve .js fileove koji se nalaze u folderu koji završava sa brojem, gdje taj folder može biti na bilo kojoj dubini, a filovi moraju biti neposredno u tom folderu.

    Sintaksa filtera: “*/!\d$/*.js
    Pojašnjenje, ovdje se koristimo parcijalnim regexom da bi opisali format naziva foldera koji se traži.
    Znači imamo tri sekcije filtera, i srednja sekcija počinje sa “!” jer je to oznaka parcijalnog regexa …što znači da samo ta srednja sekcija vrši matchanje po pravilima regexa. Jel regex: “\d$” matcha ono što završava brojem.

  3. Dohvati sve .js fileove koji se nalaze u folderu čije je ime kraće od 10 karaktera
    Opet se možemo koristiti parcijalnim regexom:
    Sintaksa filtera: “*/!^.{0,10}$/*.js
    Pojašnjenje: regex izraz “^.{0,10}$” matcha sve što je kraće od 10 karaktera.
    HINT: U ovom slučaju bitno je regex izraz vezati uz početak i kraj naziva foldera sa “^$”, jer inače bi svaki naziv u sebi sadržavao manje od 10 karaktera, ako se nebi brojali karakteri strogo od početka do kraja. No to je native regex logika…

  4. Dohvati putanje koje imaju od 30-40 karaktera u sebi.
    Za ovo se može koristiti potpuni regex search, za to treba samo započeti filter sa znakom “!” i onda se cijela sintaksa filtera matcha po regex pravilima na pathove:

    Sintaksa filtera: “!^.{30,40}$

    ?? Što ako bi htjeli parcijalni regex primjeniti samo na nultu razinu…kako ubaciti “!” na prvu sekciju a da to ne bude potpuni regex nego parcijalni regex??
    Jednostavno…
    Sitnaksa filtera: “{0}/!^.{30,40}$/*”
    Gornji izraz ima parcijalni regex na srednjoj sekciji, ali zbog {0} taj folder se mora nalaziti na nultoj razini… tako da gornji izraz dohvaća sve file-ove koji se nalaze u folderu koji je na nultoj razini i dužine je između 30 i 40 karaktera

  5. Dohvati sve fileove koji na svojoj putanji imaju folder semantic pa folder dist, gdje dist ne mora biti direktno unutar foldera semantic, niti semantic ne mora biti na nultoj razini:
    Sintaksa filtera: “*/semantic/*/dist/*


Uglavnom… nastojanje je bilo da je filter full fleksibilan i da nativno pojednostavljuje pisanje sintakse spram da se piše sirovi regex. A opet da zbog moućnosti korištenja i regexa bude neograničen u mogućnostima.

Primjene sintakse mogu biti razne… recimo kada radiš settup editora i zadaješ mu u koje file-ove će gledati “find-all” metoda, trebao bi da koristi ovako nekakvu sintaksu koja je full fleksibilna.
Mislim, gdje god se radi sa file-ovima, postoje pathovi i potrebe da se iste filtriraju.

Dakle radiš sa nekim setom (nizom) stringova a ne sa file system-om?

Dođe nebitno…jer poanta je u sintaksi, velim kako će je netko primjeniti, njemu na volju.
Cilj je samo da je sintaksa dovoljno moćna da može odraditi koji god zadatak matchanja putanje joj se zada. Tj. da pojednostavljuje i da ne nameće ograničenja u mogućnostima filtriranja.

A hoćeš li ti to implementirati direktno za rad sa file system-om ili za rad nad putanjama koje su stringovi, dođe nebitno.

Jer ti možeš napraviti metodu koja se npr zove: getFiles($currentDirectory, $filters)

I sada će ta metoda krenuti od $currentDirectory koji joj je zadan i sabirati rekurzivno sve putanje u dubinu. A parametar $filters će biti insturkcija koja fileove treba uzeti a koje ne.
I ta metoda će itekako raditi direktno sa file systemom, a spomenuta REGPATH sinstaksa će biti instrukcija toj metodi što će iz file systema uzeti, a što ne…

Zato velim, poanta je u sintaksi da se može jednoznačno tumačiti i da može sve pokriti. Primjena je kako koga želja i volja.

Nije nebitno jer 70% toga što si naveo radi out of the box što se tiče file system-a.
A izmjene koje si napravio (ostatak 30%) nisu dobre jer koristiš simbole koji već imaju svoju namjenu (npr. vitičasta zagrada).

Podsjeća me na mrtvorodjenče poput normjs-a.

Ako može neki link na taj set pravila, bit ću zahvalan.
Jer to je ono što tražim…neke postojeće normative da se uskladim sa njima.

Pa ovo će svakako biti dio normJS-a.

Prouču postojeće setove regex pravila i sintakse.

Ovim stvari postaju puno jasnije.

Znam dobro regex…i sve ove gornje instrukcije ja prevodim u regex i u domeni regexa izvršavam logiku koja je opisana ovom sintaksom.

Evo ti popis par transformacija moje sintakse u regex domenu: (može biti koja greškica, to je bila čisto priprema za gradnju engina… )

*.txt              -> ^([^\/]+)\.txt$
script.*           -> ^script\.([^.\/]+)$
*script.*          -> ^[^\/]*script\.([^.\/]+)$
*script*.*         -> ^[^\/]*script[^\/]*\.([^.\/]+)$
*/*.txt            -> ^([^\/]+\/)+([^\/]+)\.txt$
*{1}/*.txt         -> ^([^\/]+\/){1}([^\/]+)\.txt$
*{1-3}/*.txt       -> ^([^\/]+\/){1,2}([^\/]+)\.txt$
*{1+}/*.txt        -> ^([^\/]+\/){1,}([^\/]+)\.txt$
folderA/*          -> ^folderA\/.*
fol*erA/*          -> ^fol[^\/]*erA\/.*
folderA/*.txt      -> ^folderA\/([^\/]+)\.txt$
*/folderA/*        -> ^([^\/]+\/)*folderA\/.*
*/folderA/*.txt    -> ^([^\/]+\/)*folderA\/([^\/]+)\.txt$
*/folderA/*/*      -> ^([^\/]+\/)*folderA\/([^/\n]+\/)*.*
*/folderA/*/*.txt  -> ^([^\/]+\/)*folderA\/([^/\n]+\/)*([^\/]+)\.txt$

E sad…ako se nativno može pisati search: folderA/*.txt
To nikako nije regex!
Zvjezdica je placeholder koji sporazumjeva da tu može ići bilo šta, ali to nije regex. U regexu bilo šta je točka praćena zvjezdicom “.*” Točnije, u regexu bilo šta je: “(\n|.)*” …jer samo točka ne obuhvaća i nove linije.

Ono što radi “out of box” što spominješ, može koristiti nekakav svoj set pravila…ali sigurno nije defaultno na regexu. Jer kada bi defaultno bilo na regexu onda izraz:

file.txt” bi matchao izraz: “filextxt” isto kao i izraz “fileytxt” …zato jer u regex domeni je točka bilo koji karakter…što vjerovatno i sam znaš, tako da mi nisi baš jasan.

Zavisi od tvoje apstrakcije toga šta je regex.

Dalje, postoji relative i absolute path

./ # <- current dir (whole syntax can be omitted)

/ # <- root dir

Recimo da ako 'oćeš da obrišeš sve fajlove txtx extenzije i sve fajlove docy extenzije u direktorijumu dir_a koji je tree branch child current dir-a uradićeš to sa

rm ./dir_a/{*.txtx,*.docy}
# ili
rm dir_a/{*.txtx,*.docy}

komandom. Basics 101

I kompletan IT se bazira na ovom tako da ne predvidjam ni minimalan uspjeh ovom što radiš.

Koliko ja znam, ovo nije regex. To što si okačio link…a ništa nisi rekao…i dalje ništa nisi rekao.
Na tom linku ne vidim niti jednog regex pravila…da bi bilo jasno što si htio reći.

Ali da…kužim da je sintaksa regexa sigurno evoluirala i da se razlikuje od nekog jezika do jezika.
Sa regexom sam aktivno radio u jezicima Javascript, PHP, C# i Python i nisam primjetio nego minorne razlike. Tako da ne znam gdje bi bio regex to što tvrdiš da je regex…ali što god, možemo i ovako:

  • ako imaš dokumentaciju tih regex pravila koji se odnose na taj filesystem, daj onda tu dokumentaciju. (Pa da vidimo što je to)

  • ili ako imaš dokumentaciju setova pravila kojim se upravlja file-systemom, može i to. (I ta pravila ne moraju biti regex, a iskreno niti ne vjerujem da su regex.)

Naravno da je već uspjelo, dočim je meni već pomoglo (i tek će pomoći)…i dok sustav svih mojih komponenti mogu osloniti na zajedničku sintaksu za rad sa pathovima file-ova…tako da je komunikacija među komponentama sinkronizirana.

Samo bi eto volio čim više tu sintaksu sinkronizirati sa već postojećom ideologijom za rad sa pathovima. A tu će pomoći ovo što si otvorio.

To ćeš morati sam - ne želim da kvantifikujem [niti imam vremena za tako nešto] nivo tvog neznanja.

Dao sam ti wiki link od kojeg možeš krenuti pa kroz sve podlinkove u svu dubinu. Što više pročitaš i naučiš - veća je šansa da ćeš više i znati.

Postoji GLOB: glob(3) - Linux manual page
Mozda je to sto trazite
Ima recimo PHP glob: PHP: glob - Manual
A evo i pitona: glob — Unix style pathname pattern expansion — Python 3.9.1 documentation

2 Likeova

Znači ono nije regex. :slight_smile:
Sumnjam da bi ti bilo teško dati link da ga imaš… kad je to ionako način na koji bježiš iz svake rasprave. :slight_smile:

Tačno tako: možemo prebrojati kol’ko si vlastitih problema koje si postavio ovde [na forumu] riješio sam a kol’ko sam ti ih ja riješio.

2 Likeova

Malo sam izmjenio logiku…skužio neke nedosljednosti. Npr. u inicijalno postavljenoj sintaksi je bilo da:

*.txt - selektira .txt fileove na bilo kojoj dubini
folderA/*.txt - selektira .txt fileove unutar folderaA koji mora biti na nultoj razini (Root-u)

…a to dvoje onda baš nije dosljedno.
Pa po novome i folderA/*.txt selektira sve .txt filove koji se nalaze u folderA, koji može biti na bilo kojoj dubini. A ako se želi eksplicitno zadati dubina na kojoj se želi nešto selektirati, onda ide po starom za root razinu:

{0}/*.txt
{0}/folderA/*.txt

Što radi jednostavnosti pisanja i već uobičajene prakse se može za root razinu pisati i na način:

/*.txt
/folderA/*.txt

Dok ostale razine možemo selektirati brojevima…tipa: {1-4}/*.txt

Pa kad sam već postavio dokumentaciju online, slijedi ispravak:

*  -> dohvaća bilo koji file/folder
*/ -> dohvaća samo foldere

*.txt                 -> dohvaća bilo koji txt file na bilo kojoj razini
script.*              -> dohvaća sve script fileove, bilo koje ekstenzije na bilo kojoj razini
*script.*             -> dohvaća sve fileove koji završavaju sa script, bilo koje ekstenzije na bilo kojoj razini
script*.*             -> dohvaća sve fileove koji počinju sa script, bilo koje ekstenzije na bilo kojoj razini
*script*.*            -> dohvaća sve fileove koji sadrže script, bilo koje ekstenzije na bilo kojoj razini
*sc*pt*.*             -> dohvaća sve fileove koji sadrže pt nakon sc, bilo koje ekstenzije na bilo kojoj razini

*/*.txt            -> dohvaća sve .txt fileove na bilo kojoj razini
*{0}/*.txt         -> dohvaća sve .txt fileove na nultoj razini
{0}/*.txt          -> ------------------||-------------------
/*.txt             -> ------------------||-------------------

{1-3}/*.txt       -> dohvaća sve .txt fileove na dubini 1 i 2.        
{1+}/*.txt        -> dohvaća sve .txt fileove na dubini 1 ili većoj.

*/folderA/*         -> dohvaća sve što se nalazi na bilo kojoj dubini u folderu "folderA" koji također može biti na bilo kojoj razini
folderA/*           ->  --------------------||---------------------
folderA/*.txt       -> dohvaća sve .txt file-ove koji se nalaze direktno u "folderA" (koji može biti na bilo kojoj razini)
folderA/*/*.txt     -> dohvaća sve .txt file-ove koji se nalaze na bilo kojoj razini unutar "folderA" (koji može biti na bilo kojoj razini)
folderA/{1-4}/*.txt -> dohvaća sve .txt file-ove koji se nalaze unutar prve četiri razine unutar "folderA"
folderA/*/          -> dohvaća sve foldere koji se nalaze na bilo kojoj dubini unutar "folderA"
folderA/{1}/        -> dohvaća sve foldere koji se nalaze u folderu "folderA"
dirA/*/dirB/*/*.txt -> dohvaća sve .txt file-ove koji se nalaze na bilo kojoj dubini unutar foldera "dirB" koji se nalazi na bilo kojoj dubini unutar foldera "dirA" koji se nalazi na bilo kojoj razini

//Excluder: 
-*.txt              -> NE dohvaća bilo koji txt file na bilo kojoj razini. Analogno ovome, predznak minus se može dodati na bilo koji selektor da bi dobili Excluder

//Regex:
!.*\/file\d\.txt   -> ako izraz počinje sa !, onda se cijeli izraz komparira po regex searchu. Tako će ovaj selektor obuhvatiti sve fileove na bilo kojoj dubini koji u nazivu imaju broj, tipa: "file1.txt"
^.{20,30}\.txt$    -> ako izraz počinje sa ^ ili završava sa $, onda nije potrebno uskličnikom deklarirati da se radi o regex izrazu

//Regex and Excluder
-!file\\d/.+\\.txt 

//Partial regex. - omogućava da mixamo nativna pravila regpatha sa regex pravilima. Možemo bilo koju path sekciju označiti sa početnim "!" i ta sekcija će se testirati po regex pravilima.
path/to/!folder[ABC]/*    -> dohvaća sve što je na putanjama "path/to/folderA", "path/to/folderB" ili "path/to/folderC" 
// !Kod partial regexa je zabranjeno koristiti karakter "/" unutar one sekcije koju označavamo sa "!" ...tako je npr syntax error ako se zada selektor: "path/to/folder[ABC\/]/*" 
// !Svaki parcijalni regex mora započinjati sa ^ i završavati sa $ ako se želi referirati na početak i kraj izraza naziva file-a kojeg se matcha (To je native regex)
patth/to/^.{0,2}$/file.*  -> ako parcijalni regex počinje sa ^ ili završava sa $, onda nije potrebno uskličnikom deklarirati da se radi o regex izrazu

To neće promjeniti jel ono je ili nije regex.
Iskreno, baci pogled ovdje ako ti regex još nije sjeo…a vidim da nije. Sjećam se i one teme gdje sam je otvorio vezano uz regex…pa si imao puno krivih kontacija oko njega.

Uglavnom, ovdje možeš testirati regex izraze: https://regexr.com/
Odličan i jednostavan alat. Usto ćeš primjetiti da i taj izvor pokazuje da nije regex ono što ti misliš da je.

Ako imaš ikakav backup da potvrdiš rečeno, rado ću poslušati…u suprotnom vjerovat ću radije ovima što su posvetili izvjesno svoje vrijeme da približe regularne izraze običnom čovjeku.
Usto su kompatibilni sa onim što sam sreo u Javascriptu, PHPu, C#-u i Pythonu … tako da me stvarno čudiš da jedino ti znaš neku drugu regex sintaksu … koju vidi čuda, nitko ne koristi nigdje. Bit će Ozana ti šapnula. :slight_smile:

Jedino da si se [opet] fascinir’o u postu šta je DRY.

:rofl:

Koristim malo duže regex od tebe, al’ hvala na ponudi. :+1:
Koristim ga tol’ko dugo da znam da ujedno i jedna od posljednjih opcija kojoj treba pribjeći kako već spada u najsporije akcije koje kompjuter može izvesti.

Koristiš li look ahead i look behind?
Jesi li čuo za yagni?