स्ट्रिंग से अल्फ़ान्यूमेरिक वर्ण न निकालें


224

मैं निम्नलिखित स्ट्रिंग को प्रदान किए गए आउटपुट में परिवर्तित करना चाहता हूं।

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

मैं किसी भी समाधान है कि जैसे विशेष वर्ण संभाल लेंगे नहीं पाया है \r, \n, \b, आदि

मूल रूप से मैं सिर्फ ऐसी किसी भी चीज़ से छुटकारा पाना चाहता हूं जो अल्फ़ान्यूमेरिक नहीं है। यहाँ मैं कोशिश की है ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

एकाधिक चरणों के साथ एक अन्य प्रयास

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

परिणामों के साथ

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

किसी भी सहायता की सराहना की जाएगी।

काम कर समाधान:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

दिलचस्प सवाल है, \ n in \ new यह स्पष्ट है कि यह क्या हो रहा है। मुझे पूरी तरह से यकीन नहीं है कि कैसे खोजने और बदलने के लिए
विल बक

1
क्या इनपुट बच गए हैं / उन्हें कैसे सौंपा गया है? var Input = "\\test\red\bob\fred\new"इस स्ट्रिंग में "लाल" नहीं है, इसलिए आपका पहला प्रयास सही है, क्या आप लिटरल के खिलाफ परीक्षण कर रहे हैं "\\\\test\\red\\bob\\fred\\new"?
एलेक्स के।

/[^\w\s]+/giइसे इस्तेमाल करे।
बार्टोज़ ग्रेज़ीबोस्की

मुझे लगता है कि सवाल यह है कि क्या आपके इनपुट स्ट्रिंग में बैकस्लैश विशेष वर्णों का प्रतिनिधित्व करते हैं? (आपके उदाहरण आउटपुट के आधार पर, मैं अनुमान लगा रहा हूँ।)
डेव

डबल कोट्स से सिंगल कोट्स पर स्विच करने की कोशिश की?
ऑप्टिमस क्राइम

जवाबों:


468

गैर-अल्फ़ान्यूमेरिक वर्ण हटा रहा है

इनपुट स्ट्रिंग से गैर-अल्फ़ान्यूमेरिक वर्णों को हटाने के लिए निम्नलिखित एक सही regex है:

input.replace(/\W/g, '')

ध्यान दें कि \Wइसके बराबर है [^0-9a-zA-Z_]- इसमें अंडरस्कोर वर्ण शामिल है। अंडरस्कोर के उपयोग को भी हटाने के लिए जैसे:

input.replace(/[^0-9a-z]/gi, '')

इनपुट विकृत है

चूंकि परीक्षण स्ट्रिंग में विभिन्न बच गए वर्ण होते हैं, जो अल्फ़ान्यूमेरिक नहीं हैं, यह उन्हें हटा देगा।

स्ट्रिंग में एक बैकस्लैश भागने की जरूरत है अगर इसे सचमुच लिया जाए:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

कुरूप तारों को संभालना

यदि आप सही तरीके से इनपुट स्ट्रिंग से बच नहीं पा रहे हैं (क्यों नहीं?), या यह किसी प्रकार के अविश्वास / गलत स्रोत से आ रहा है - तो आप ऐसा कुछ कर सकते हैं:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

ध्यान दें कि स्ट्रिंग के जौन प्रतिनिधित्व में उद्धरण शामिल हैं:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

लेकिन रिप्लेसमेंट रेगेक्स द्वारा उन्हें भी हटा दिया जाता है।


10
यह अंडरस्कोर नहीं हटाता है।
kylex

4
@kylex, ऐसा इसलिए है क्योंकि अंडरस्कोर को किसी कारण से अल्फ़ान्यूमेरिक गुच्छा का एक हिस्सा माना जाता है
यूजीन कुजमेनको

12
"क्योंकि वे चर पहचानकर्ताओं में आमतौर पर कानूनी हैं।" । प्रश्न में कोई "_" नहीं है, निश्चित रूप \Wसे [_\W](जिसका उपयोग प्रश्न में किया जाता है) या इसी तरह के अक्षर को हटा देगा।
AD7six

1
@ AD7six, क्या आप इस बारे में विस्तार से बता सकते हैं कि जब स्ट्रिंग एक अविश्वसनीय स्रोत से आ रही है तो JSON.stringify () का उपयोग क्यों किया जाना चाहिए? क्या ऐसा करने के लिए कोई सुरक्षा चिंता नहीं है? धन्यवाद!
जंबुस्सो

1
@guithor यह "एक होना चाहिए" नहीं है, या यह सुरक्षा को प्रभावित करता है; यदि "कुछ स्ट्रिंग" प्राप्त हो रही है और जो भी कारण से यह मूल रूप से बोर्क किया गया है (इस सवाल से स्पष्ट नहीं है कि स्ट्रिंग विकृत क्यों है) - यह स्ट्रिंग को देखने की अनुमति देता है कि यह क्या है: jsfiddle.net/Z6N7C
AD7six

49

सभी मौजूदा जवाबों में अभी भी quirks हैं, सबसे अच्छी बात जो मैं आ सकता था:

string.replace(/[^A-Za-z0-9]/g, '');

एक उदाहरण जो कीबोर्ड पर मिल सकने वाली हर कुंजी को दर्शाता है:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

आउटपुट: '123abcABC'


1
input.replace(/\W/g, '')_एक स्ट्रिंग में छोड़ देता है । @ डेनिमेटिक्स सही string.replace(/[^A-Za-z0-9]/g, '');काम करता है बेहतर है क्योंकि यह स्ट्रिंग से सभी गैर-अल्फ़ान्यूमेरिक चार्ट को हटा देता है।
टिम

1
और फिर भी, इस उत्तर की कोई भी अनुमति वास्तव में पूछे गए प्रश्न का उत्तर नहीं देती है
AD7six

10

समस्या यह नहीं है कि आप पात्रों को कैसे बदलते हैं, समस्या यह है कि आप स्ट्रिंग को कैसे इनपुट करते हैं।

यह केवल इनपुट कि एक बैकस्लैश चरित्र है में पहली बैकस्लैश है, दूसरों के नियंत्रण वर्ण का हिस्सा हैं \r, \b, \fऔर \n

के रूप में उन backslashes अलग अक्षर नहीं हैं, लेकिन एकल नियंत्रण वर्ण लिखने के लिए अंकन का हिस्सा है, वे अलग से हटाया नहीं जा सकता। यानी आप बैकस्लैश को हटा नहीं सकते \nक्योंकि यह दो अलग-अलग वर्ण नहीं है, यह तरीका है कि आप नियंत्रण वर्ण LF, या पंक्ति फ़ीड लिखते हैं

यदि आप उस इनपुट को वांछित आउटपुट में बदलना चाहते हैं, तो आपको प्रत्येक कंट्रोल कैरेक्टर को संबंधित अक्षर से बदलना होगा, जैसे कि कैरेक्टर के \nसाथ कैरेक्टर को बदलना n

एक नियंत्रण चरित्र को बदलने के लिए आपको एक चरित्र सेट का उपयोग करने की आवश्यकता होती है [\r], जैसा \rकि एक नियमित अभिव्यक्ति में एक विशेष अर्थ है:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

डेमो: http://jsfiddle.net/SAp4W/


मैं समझता हूं कि आप जो कुछ भी कह रहे हैं, लेकिन सवाल अभी भी खड़ा है और अभी तक किसी ने भी सही जवाब नहीं दिया है। इनपुट परिवर्तन हो सकता है लेकिन किसी ने भी इसका जवाब नहीं दिया है कि जेएस में इसे प्रोग्रामेटिक रूप से कैसे बदला जाए।
बॉबी तोप

2
@BobbyCannon: मैंने ऐसा कोड जोड़ा है जो आपका सटीक इनपुट लेता है और वांछित आउटपुट उत्पन्न करता है।
गुफा

5

आप इस regex की कोशिश कर सकते हैं:

value.replace(/[\W_-]/g, '');

प्रति प्रश्न: मैं केवल उस चीज़ से छुटकारा पाना चाहता हूं जो अल्फ़ान्यूमेरिक नहीं है। आप किस आउटपुट की उम्मीद कर रहे थे?
मिरिकियो

0

यह सभी गैर-अल्फ़ान्यूमेरिक वर्णों को हटा देता है, पूंजीकरण को संरक्षित करता है, और शब्दों के बीच रिक्त स्थान को संरक्षित करता है।

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

यह काम नहीं करता (कृपया प्रश्न पढ़ें) - यह भी चीजों को करने का एक जटिल तरीका है।
AD7six

1
@ AD7six मेरी त्रुटि को इंगित करने के लिए धन्यवाद। जब मैंने WebStrom में इनपुट को चिपकाया तो यह स्वतः ही प्रत्येक मौजूदा बैकस्लैश में 2 अतिरिक्त बैकस्लैश जोड़ दिया। मैं इसे विफल करने में विफल रहा। इनपुट = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new"।
फ्लावियो

-1

यहाँ एक उदाहरण है जिसका आप उपयोग कर सकते हैं,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

यदि आप इस \\test\red\bob\fred\newतार को रखना चाहते हैं , तो आपको सभी बैकस्लैश ( \) से बचना चाहिए । जब आप \\test\\red\\bob\\fred\\newअपना स्ट्रिंग लिखते हैं तो वास्तव में सिंगल बैकस्लैश होते हैं। आप अपनी स्ट्रिंग को प्रिंट करना सुनिश्चित कर सकते हैं।
तो अगर आपके स्ट्रिंग में बैकस्लैश बच गए myString.replace(/\W/g,'')हैं तो सामान्य रूप से काम करेंगे।


1
यदि आप "आपको सभी बैकस्लैश () से बचना चाहिए" का सुझाव देना चाहते हैं, तो आपको यह करने के लिए एक उदाहरण प्रदान करना होगा।
बॉबी तोप

क्या बात है आप डबल बैकस्लैश हैं ??? और मेरा यह कहने का अर्थ है कि "जब आप \\ टेस्ट \\ लाल \\ बोब \\ लिखेंगे, तो \\ ने आपके तार को नया कर दिया है जिसमें वास्तव में सिंगल बैकस्लैश शामिल हैं।" ??? क्या यह व्याख्या नहीं कर रहा है?
शिफ्ट66

इनपुट "\\ test \ red \ bod \ fred \ new" है और बदल नहीं सकता। मुझे उस इनपुट स्ट्रिंग के लिए एक समाधान की आवश्यकता है। अगर आप मुझे "बैकस्लैश एक्सक्यूज़" दिखाना चाहते हैं तो एक उदाहरण दें। हम इनपुट नहीं बदल सकते। स्वीकृत उत्तर देखें। इनपुट ने इनपुट को बदलने की अनुमति नहीं दी, लेकिन वांछित आउटपुट दिया।
बॉबी तोप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.