एक स्थान के साथ सभी गैर अल्फा न्यूमेरिक वर्ण, नई लाइन्स और कई व्हाइट स्पेस बदलें


136

मैं एक स्वच्छ RegEx समाधान की तलाश में हूँ

  • सभी गैर अल्फा-न्यूमेरिक वर्ण
  • सभी न्यूलाइन्स
  • सफेद स्थान के सभी कई उदाहरण

सिंगल स्पेस के साथ


घर पर खेलने वालों के लिए ( निम्नलिखित काम करता है )

text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");

मेरी सोच RegEx शायद एक कथन में इसे प्राप्त करने के लिए पर्याप्त शक्तिशाली है। मुझे लगता है कि आईडी की जरूरत घटक हैं

  • [^a-z0-9] - गैर अल्फा-न्यूमेरिक वर्णों को हटाने के लिए
  • \s+ - रिक्त स्थान के किसी भी संग्रह से मेल खाते हैं
  • \r?\n|\r - सभी नई लाइन का मिलान करें
  • /gmi - ग्लोबल, मल्टी-लाइन, केस असंवेदनशील

हालांकि, मैं सही तरीके से रेगेक्स को स्टाइल नहीं कर सकता ( निम्नलिखित काम नहीं करता है )

text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");


इनपुट

234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5


वांछित उत्पादन

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5

आपका प्रयास वास्तव में कैसे काम नहीं करता है? क्या गलत हो जाता है?
नुकीले

जवाबों:


235

ज्ञात हो, कि \W अंडरस्कोर निकलता है । के लिए एक छोटा समतुल्य [^a-zA-Z0-9]होगा[\W_]

text.replace(/[\W_]+/g," ");

\Wशब्द पात्रों के लिए शॉर्टहैंड का निषेध है (अंडरस्कोर सहित)\w[A-Za-z0-9_]

Regex101.com पर उदाहरण


इसे जांचें और इसका परीक्षण करें, अभी तक js-regex में बहुत अनुभव नहीं है: p हैप्पी
जॉनी 5

6
ध्यान दें कि \Wगैर-लैटिन वर्णों को गैर-शब्द वर्णों के रूप में भी पहचानेंगे।
टायब्लिट्ज़

1
मैंने इन सभी वर्षों के बाद इस उत्तर को सही बताया, क्योंकि मैंने पीछे देखा और स्वीकार नहीं किया गया अंडरस्कोर
TheGeneral

143

जॉनी 5 ने मुझे इसके लिए हराया। मैं \W+के \sरूप में के बिना का उपयोग करने का सुझाव जा रहा था text.replace(/\W+/g, " ")। यह सफेद जगह को भी कवर करता है।


धन्यवाद @ टी-कैटसन उस ओर इशारा करने के लिए! इसे छोड़ दिया, और सरुमन, आप जो भी है उसका सर्वोत्तम उत्तर देने के लिए स्वतंत्र हैं :-) लेकिन यह होना चाहिए \W+, [W+]ठीक नहीं , नया साल मुबारक हो!
जॉनी 5

धन्यवाद, @ जॉनी 5! मैंने आपके द्वारा सुझाए गए परिवर्तन किए हैं। मैंने पहले कोष्ठक के साथ परीक्षण किया था और अब मैं देखता हूं कि यह उनके बिना काम करता है। आपको भी नव वर्ष की शुभकामनाये।
टी-कैटसन

1
अरे @ टी-कैटसन अपवाद जोड़ने का एक तरीका है? मैं किरदार &और रखना चाहता हूं -। कोई सुझाव?
रेनाटो गामा

1
मैंने निम्नलिखित परिवर्तन / (\ W +) | (_) / g को अनदेखा करने के लिए _ भी किया। लेकिन सिर्फ यह सोचकर कि यह पहले मॉडल में अनदेखी क्यों नहीं कर रहा है और मेरा रेगेक्स कुशल है।
श्रीधर गुदिमेला


6

वैसे मुझे लगता है कि आपको प्रत्येक पैटर्न में एक मात्रा जोड़ने की जरूरत है। इसके अलावा गाड़ी-वापसी की बात थोड़ी मज़ेदार है:

text.replace(/[^a-z0-9]+|\s+/gmi, " ");

संपादित\s बात मैचों \rऔर \nभी।


हाँ, वहाँ पर कुछ टॉम मूर्खता थी, जो इस विषय पर अन्य उत्तरों से चमके थे, हालांकि यह बहुत धन्यवाद काम करता है!
द जेनरल

2

एक अलग पोस्ट को देखा, जिसमें विशेषांक भी थे, जो बहुत अच्छा है

s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")


2

यह मेरा एक पुराना पद है, स्वीकृत उत्तर अधिकांश भाग के लिए अच्छे हैं। हालांकि मैंने प्रत्येक समाधान को बेंचमार्क करने का फैसला किया और एक और स्पष्ट (केवल मनोरंजन के लिए)। मुझे आश्चर्य है कि अगर अलग-अलग आकार के तारों के साथ अलग-अलग ब्राउज़रों पर रेगेक्स पैटर्न के बीच अंतर था।

तो मूल रूप से मैं पर jsPerf का इस्तेमाल किया

  • Chrome 65.0.3325 / विंडोज 10 0.0.0 में परीक्षण
  • एज 16.16299.0 / विंडोज 10 0.0.0 में परीक्षण

रेगेक्स पैटर्न मैंने परीक्षण किया था

  • /[\W_]+/g
  • /[^a-z0-9]+/gi
  • /[^a-zA-Z0-9]+/g

मैंने उन्हें यादृच्छिक पात्रों की एक लंबी लंबाई के साथ लोड किया

  • लंबाई 5000
  • लंबाई 1000
  • लंबाई 200

उदाहरण जावास्क्रिप्ट मैंने इस्तेमाल किया var newstr = str.replace(/[\W_]+/g," ");

प्रत्येक रन में प्रत्येक रेगेक्स पर 50 या अधिक नमूने शामिल थे, और मैं उन्हें प्रत्येक ब्राउज़र पर 5 बार चलाता हूं।

चलो हमारे घोड़ों की दौड़!

परिणाम

                                Chrome                  Edge
Chars   Pattern                 Ops/Sec     Deviation   Op/Sec      Deviation
------------------------------------------------------------------------
5,000   /[\W_]+/g                19,977.80  1.09         10,820.40  1.32
5,000   /[^a-z0-9]+/gi           19,901.60  1.49         10,902.00  1.20
5,000   /[^a-zA-Z0-9]+/g         19,559.40  1.96         10,916.80  1.13
------------------------------------------------------------------------
1,000   /[\W_]+/g                96,239.00  1.65         52,358.80  1.41
1,000   /[^a-z0-9]+/gi           97,584.40  1.18         52,105.00  1.60
1,000   /[^a-zA-Z0-9]+/g         96,965.80  1.10         51,864.60  1.76
------------------------------------------------------------------------
  200   /[\W_]+/g               480,318.60  1.70        261,030.40  1.80
  200   /[^a-z0-9]+/gi          476,177.80  2.01        261,751.60  1.96
  200   /[^a-zA-Z0-9]+/g        486,423.00  0.80        258,774.20  2.15

सत्य जाना जाता है, दोनों ब्राउज़रों में रेगेक्स (विचलन को ध्यान में रखते हुए) लगभग अप्रभेद्य थे, हालांकि मुझे लगता है कि अगर यह इसे और भी अधिक बार चलाता है तो परिणाम थोड़ा और अधिक स्पष्ट हो जाएंगे (लेकिन बहुत अधिक नहीं)।

1 वर्ण के लिए सैद्धांतिक स्केलिंग

                            Chrome                        Edge
Chars   Pattern             Ops/Sec     Scaled            Op/Sec    Scaled
------------------------------------------------------------------------
5,000   /[\W_]+/g            19,977.80  99,889,000       10,820.40  54,102,000
5,000   /[^a-z0-9]+/gi       19,901.60  99,508,000       10,902.00  54,510,000
5,000   /[^a-zA-Z0-9]+/g     19,559.40  97,797,000       10,916.80  54,584,000
------------------------------------------------------------------------

1,000   /[\W_]+/g            96,239.00  96,239,000       52,358.80  52,358,800
1,000   /[^a-z0-9]+/gi       97,584.40  97,584,400       52,105.00  52,105,000
1,000   /[^a-zA-Z0-9]+/g     96,965.80  96,965,800       51,864.60  51,864,600
------------------------------------------------------------------------

  200   /[\W_]+/g           480,318.60  96,063,720      261,030.40  52,206,080
  200   /[^a-z0-9]+/gi      476,177.80  95,235,560      261,751.60  52,350,320
  200   /[^a-zA-Z0-9]+/g    486,423.00  97,284,600      258,774.20  51,754,840

मैं इन परिणामों में बहुत अधिक नहीं ले सकता क्योंकि यह वास्तव में एक महत्वपूर्ण अंतर नहीं है, हम वास्तव में बता सकते हैं कि यह धीमा है: ओ। इसके अतिरिक्त मैं सुपर बोर हो गया था।

वैसे भी आप अपने स्वयं के लिए बेंचमार्क चला सकते हैं।

Jsperf बेंचमार्क यहाँ


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.