Kaip padalinti ilgą reguliarią išraišką į keletą „JavaScript“ eilučių?

Turiu labai ilgą reguliarią išraišką, kurią noriu padalyti į kelias eilutes mano „JavaScript“ kode, kad kiekviena linija, kurios ilgis yra 80 simbolių, atitiktų JSLint taisykles. Manau, kad tai tik geriau skaityti. Čia yra pavyzdžio pavyzdys:

 var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
107
07 сент. nustatė Nik Sumeiko 07 sept. 2012-09-07 14:17 '12, 14:17 pm 2012-09-07 14:17
@ 9 atsakymai

Galite konvertuoti jį į eilutę ir sukurti išraišką skambindami new RegExp() :

 var myRE = new RegExp (['^(([^<>()[\]\\.,;:\\s@\"]+(\\.[^<>(),[\]\\.,;:\\s@\"]+)*)', '|(\\".+\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.', '[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\\.)+', '[a-zA-Z]{2,}))$'].join('')); 

Pastabos:

  1. konvertuojant išraiškos raidę į eilutę, turite vengti visų backslashes, nes skaičiuojant eilutės gramatinę reikšmę yra naudojami backslashes. (Daugiau informacijos žr. Komentarą Kayo.)
  2. RegExp priima modifikatorius kaip antrąjį parametrą

    /regex/g => new RegExp('regex', 'g')

[ Papildymas ES20xx (pažymėtas šablonas)]

ES20xx galite naudoti žymų šablonus . Žr. Fragmentą.

Pastabos:

  • Trūkumas yra tas, kad negalite naudoti paprastos vietos įprastoje išraiška (visada naudokite \s , \s+ , \s{1,x} ,, \n ir tt).

94
07 сент. Atsakymas pateikiamas KooiInc 07 Sep. 2012-09-07 14:20 '12, 12:20 pm 2012-09-07 14:20

Išplėstant „@KooiInc“ atsakymą išvengiama automatinio kiekvieno specialiojo simbolio pabėgimo naudojant „ RegExp objekto source savybę.

Pavyzdys:

 var urlRegex= new RegExp('' + /(?:(?:(https?|ftp):)?\/\/)/.source // protocol + /(?:([^:\n\r]+):([^@\n\r]+)@)?/.source // user:pass + /(?:(?:www\.)?([^\/\n\r]+))/.source // domain + /(\/[^?\n\r]+)?/.source // request + /(\?[^#\n\r]*)?/.source // query + /(#?[^\n\r]*)?/.source // anchor ); 
border=0

arba, jei norite išvengti .source savybės kartojimo, galite tai padaryti naudodami Array.map() funkciją:

 var urlRegex= new RegExp([ /(?:(?:(https?|ftp):)?\/\/)/ // protocol ,/(?:([^:\n\r]+):([^@\n\r]+)@)?/ // user:pass ,/(?:(?:www\.)?([^\/\n\r]+))/ // domain ,/(\/[^?\n\r]+)?/ // request ,/(\?[^#\n\r]*)?/ // query ,/(#?[^\n\r]*)?/ // anchor ].map(function(r) {return r.source}).join('')); 

.map(r => r.source) kartografavimo funkcija gali būti sumažinta iki: .map(r => r.source)

84
13 янв. Atsakymas duotas korun 13 sausio. 2016-01-13 01:34 '16 at 1:34 2016-01-13 01:34

new RegExp naudojimas new RegExp nepatogu, nes turite vengti visų backslashes. Galite rašyti mažesnes reguliarias išraiškas ir susieti jas.

Bendrinkite šią įprastą išraišką

 /^foo(.*)\bar$/ 

Naudosime šią funkciją, kad viskas taptų gražesnė vėliau.

 function multilineRegExp(regs, options) { return new RegExp(regs.map( function(reg){ return reg.source; } ).join(''), options); } 

Ir dabar tegul roko

 var r = multilineRegExp([ /^foo/, // we can add comments too /(.*)/, /\bar$/ ]); 

Kadangi ji turi kainą, pabandykite sukurti tikrą reguliarią išraišką tik vieną kartą ir tada ją naudoti.

21
15 июня '15 в 2:37 2015-06-15 02:37 atsakymą pateikė Riccardo Galli birželio 15 d., 15 val. 2:37 2015-06-15 02:37

Pirmiau pateiktoje formuluotėje nėra juodų linijų, kurios neveikia tinkamai. Taigi, aš redagavau įprastą išraišką. Atminkite, kad ši reguliarioji išraiška veikia 99,99% el.

 let EMAIL_REGEXP = new RegExp (['^(([^<>()[\\]\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\.,;:\\s@\"]+)*)', '|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.', '[0-9]{1,3}\])|(([a-zA-Z\\-0-9]+\\.)+', '[a-zA-Z]{2,}))$'].join('')); 
4
27 дек. atsakymą pateikė Anvesh Reddy 27 d. 2016-12-27 19:18 '17 19:18 2016-12-27 19:18

Asmeniškai norėčiau eiti į mažiau sudėtingą reguliarią išraišką:

 /\S+@\S+\.\S+/ 

Žinoma, tai yra mažiau tiksli nei jūsų dabartinis modelis, bet ką jūs bandote pasiekti? Ar bandote sugauti atsitiktines klaidas, kurios gali pasirodyti jūsų naudotojams, ar nerimaujate, kad naudotojai gali bandyti įvesti neteisingus adresus? Jei tai būtų pirmasis, aš eisiu pagal paprastesnę schemą. Jei taip yra, tai gali būti geriau patikrinti el. Laišką, išsiųstą šiuo adresu.

Tačiau, jei norite naudoti dabartinį šabloną, jį (IMO) bus lengviau skaityti (ir prižiūrėti!) Sukūrę ją iš mažesnių šablonų:

 var box1 = "([^<>()[\]\\\\.,;:\s@\"]+(\\.[^<>()[\\]\\\\.,;:\s@\"]+)*)"; var box2 = "(\".+\")"; var host1 = "(\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])"; var host2 = "(([a-zA-Z\-0-9]+\\.)+[a-zA-Z]{2,})"; var regex = new RegExp("^(" + box1 + "|" + box2 + ")@(" + host1 + "|" + host2 + ")$"); 
1
07 сент. Bart Kiers atsakymas 07 Sep. 2012-09-07 14:39 '12, 14:39 pm 2012-09-07 14:39

Jei norite išvengti join masyvo, galite naudoti ir šią sintaksę:

 var pattern = new RegExp('^(([^<>()[\]\\.,;:\s@\"]+' + '(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@' + '((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|' + '(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'); 
0
07 марта '18 в 15:00 2018-03-07 15:00 atsakymas duotas andreasonny83 Kovo 07 '18, 15:00 2018-03-07 15:00

Galite tiesiog naudoti eilutę.

 var pattenString = "^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|"+ "(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|"+ "(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$"; var patten = new RegExp(pattenString); 
0
23 нояб. atsakymas duotas Mubeena lapkričio 23 d. 2018-11-23 13:45 '18 - 1:45 pm 2018-11-23 13:45

Čia yra gerų atsakymų, tačiau išsamumo sumetimais kažkas turėtų paminėti pagrindinį „Javascript“ paveldėjimo bruožą su prototipų grandine . Kažkas panašaus iliustruoja idėją:

Su ES 2015 galite tai padaryti naudodami šablonų literatūrą: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals

 console.log(`string text line 1 string text line 2`); 

Šablonų žymos padės pašalinti tarpus. Čia yra šablono žyma, pašalinanti tarpus: https://muffinresearch.co.uk/removing-leading-whitespace-in-es6-template-strings/

-1
15 июня '16 в 19:25 2016-06-15 19:25 atsakymas duotas vijaistui birželio 15 d. 16:25 2016-06-15 19:25

Kiti klausimai apie „ žymas „ arba Užduoti klausimą