Javascript-də bir neçə xətaya uzun bir müntəzəm ifadə necə bölünür?

Uzunluğu 80 karakter uzunluğundaki hər bir satır JSLint qaydalarına uyğundur ki, JavaScript kodumda bir neçə satıra bölmek istiyorum ki, çox uzun bir düzenli ifade var. Hesab edirəm ki, bu, oxumaq üçün daha yaxşıdır. Burada nümunə nümunəsi:

 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 сент. Nik Sumeiko tərəfindən təyin olunan 07 sentyabr. 2012-09-07 14:17 '12 at 2:17 pm 2012-09-07 14:17
@ 9 cavab

Bir new RegExp() çevirə və new RegExp() çağıraraq bir ifadə yarada bilərsiniz:

 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('')); 

Qeydlər:

  1. simvolu bir simliya çevirərkən, bütün simvollardan qaçınmalısınız, çünki simvollar bir simli literal hesablama zamanı ters daraqlardan istifadə olunur. (Daha ətraflı məlumat üçün şərh edin.)
  2. RegExp modifikatorları ikinci parametr kimi qəbul edir

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

[ Əlavə ES20xx (qeydli şablon)]

ES20xx-da siz tag şablonlarını istifadə edə bilərsiniz. Fragmana baxın.

Şərhlər:

  • Burada mənfi cəhətdir ki, müntəzəm ifadə simvolunda sadə bir yerdən istifadə edə bilməyəcəksiniz (həmişə \s , \s+ , \s{1,x} , \t , \n ).

94
07 сент. Cavab KooiInc 07 Sep verilir. 2012-09-07 14:20 '12 at 2:20 pm 2012-09-07 14:20

@KooiInc cavabını genişləndirmək RegExp obyektinin source əmlakını istifadə edərək, hər bir xüsusi xarakterdən avtomatik qaçışdan RegExp .

Məsələn:

 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

və ya .source əmlakını təkrarlamaqdan qaçmaq istəyirsinizsə, bunu Array.map() funksiyası ilə edə bilərsiniz:

 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('')); 

ES6-da, Xəritəçəkmə funksiyası: .map(r => r.source)

84
13 янв. Cavab qorun 13 yanvar verilir . 2016-01-13 01:34 '16 'da 1:34' də 2016-01-13 01:34

new RegExp strings istifadə edərək new RegExp əlverişsizdir, çünki bütün backslashes qarşısını almaq lazımdır. Kiçik müntəzəm ifadələr yaza və onları birləşdirə bilərsiniz.

Bu normal ifadəni paylaşın

 /^foo(.*)\bar$/ 

Daha sonra işi daha gözəl etmək üçün funksiyadan istifadə edəcəyik.

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

Və indi qoy qoy

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

Bir dəyəri olduğundan, bir dəfə bir dəfə normal bir ifadəni yaratmağa cəhd edin və onu istifadə edin.

21
15 июня '15 в 2:37 2015-06-15 02:37 Cavab Riccardo Galli tərəfindən 15 İyun '15 'də 2:37' də veriləcək

Yuxarıdakı ifadədə düzgün işləməyən qara xətt yoxdur. Beləliklə, mən normal ifadəni düzəldirdim. Xahiş edirik e-poçt identifikasiyası üçün 99.99% -i işləyən bu normal ifadəni nəzərdən keçirin.

 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 дек. cavab 27 dekabrda Anvez Reddy tərəfindən verilir . 2016-12-27 19:18 '17 saat 19:18 'də 2016-12-27 19:18' də

Şəxsən mən daha az mürəkkəb bir ifadəyə gedirəm:

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

Əlbəttə, mövcud modelinizdən daha az dəqiqlik var, amma nəyə nail olmaq üçün çalışırsınız? İstifadəçilərinizə görünən təsadüfi səhvləri yaxalamaq üçün istifadə edirsiniz və ya istifadəçilərinizin etibarsız ünvanlara daxil ola biləcəyindən narahatsınız? Bu ilk idi, mən daha sadə bir sxemə görə gedərdim. Bu sonuncu olsa, bu ünvana göndərilən elektron poçtu yoxlamaq daha yaxşı ola bilər.

Halbuki, mövcud şablonunuzdan istifadə etmək istəyirsinizsə, (IMO) oxumaq daha asan olacaq (və qorumaq!) Bu kimi kiçik alt şablonlardan yaratmaqla:

 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 tərəfindən verilmiş cavab 07 Sep. 2012-09-07 14:39 '12 at 2:39 pm 2012-09-07 14:39

Birləşmə sətrindən yayınmaq üçün, aşağıdakı sözdizimini də istifadə edə bilərsiniz:

 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 cavab verildi andreasonny83 07 mart '18 saat 15:00 'də 2018-03-07 15:00

Sadəcə simli əməliyyatdan istifadə edə bilərsiniz.

 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 нояб. Cavab Mubeena 23 noyabrda verilir. 2018-11-23 13:45 '18 saat 13:45 'də 2018-11-23 13:45

Burada yaxşı cavablar var, amma tamlığı üçün kimsə prototiplər zənciri ilə Javascript mirasın əsas xüsusiyyətini qeyd etməlidir. Bənzər bir şey fikir göstərir:

ES 2015 ilə şablon yazıları ilə bunu edə bilərsiniz: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals

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

Şablon etiketləri boşluqları aradan qaldırmağa kömək edəcək. Burada boşluqları aradan qaldıran bir şablon etiketi: https://muffinresearch.co.uk/removing-leading-whitespace-in-es6-template-strings/

-1
15 июня '16 в 19:25 2016-06-15 19:25 Cavab vijayst 15 iyun '19 : 19:25 2016-06-15 19:25 verilir

tags ilə bağlı digər suallar və ya bir sual