जावास्क्रिप्ट नियमित अभिव्यक्ति: पहले और आखिरी स्लैश को हटा दें


83

मेरे पास जावास्क्रिप्ट में ये तार हैं:

/banking/bonifici/italia
/banking/bonifici/italia/

और अगर यह मौजूद है तो मैं पहली और आखिरी स्लैश को हटाना चाहूंगा।

मैंने कोशिश की, ^\/(.+)\/?$लेकिन यह काम नहीं करता है।

स्टैकओवरफ़्लो में कुछ पोस्ट पढ़ने से मैंने पाया कि php में ट्रिम फंक्शन है और मैं उनके जावास्क्रिप्ट अनुवाद ( http://phpjs.org/functions/trim : 566) का उपयोग कर सकता हूं, लेकिन मैं "सरल" नियमित अभिव्यक्ति पसंद करूंगा।


जवाबों:


194
return theString.replace(/^\/|\/$/g, '');

"सभी ( /.../g) अग्रणी स्लैश ( ^\/) या ( |) ट्रेलिंग स्लैश ( \/$) को खाली स्ट्रिंग के साथ बदलें ।"


19
मैंने "+": प्रतिस्थापन (/ ^ \ / + + | \ / + $ / g, '') का उपयोग करके किसी भी संख्या में अग्रणी या अनुगामी स्लैश को हटाने के लिए इसे संशोधित किया
रिकुमाली

यदि स्ट्रिंग है तो क्या होगा //www.google.com? //याद आओगे।
आइजैक फरेरा

@IsaacFerreira आप इस का उपयोग कर सकते हैं, यह /^\s*\/*\s*|\s*\/*\s*$/gmकुछ संभावित व्हाट्सएप की देखभाल करता है इससे पहले कि स्लैश और कई स्लैश के बाद *
बेनराय

36

रीजेक्स का उपयोग करने का कोई वास्तविक कारण यहां नहीं है, स्ट्रिंग फ़ंक्शन ठीक काम करेंगे:

var string = "/banking/bonifici/italia/";
if (string.charAt(0) == "/") string = string.substr(1);
if (string.charAt(string.length - 1) == "/") string = string.substr(0, string.length - 1);
// string => "banking/bonifici/italia"

इसे देखें jsFiddle पर कार्रवाई करें ।

संदर्भ:


3
मुझे लगता है कि कभी-कभी regexp से बचने से पठनीयता पर मदद मिलेगी, लेकिन इस मामले में regexp की 1 पंक्ति और 1 पंक्ति की टिप्पणी का उपयोग करके वास्तव में बहुत अधिक सुरुचिपूर्ण तरीके से काम किया जाएगा।
kroe

3
यह स्ट्रिंग की शुरुआत या अंत में डुप्लिकेट स्लैश को दूर नहीं करेगा ("// बैंकिंग / बोन / आईटीए //") जो रिप्लेक्स जैसे रिप्लेसमेंट (/ ^ \ / + | \ / $ / g, '') करेगा ।
हीरे

मुझे नहीं लगता कि यह पठनीयता बढ़ाने में भी मदद करता है, यह सिर्फ इस बात की परीक्षा बन जाता है कि कोई व्यक्ति रेगेक्स को समझ सकता है या नहीं। मुझे लगता है कि ज्यादातर लोग कुछ सेकंड के बाद बता सकते हैं कि क्या / ^ \ /। \ / $ / G है, खासकर अन्य नॉन-रेगेक्स कोड के संदर्भ में। तो इस मामले में, regex बेहतर IMO है।
विलियम

7

यदि RegExp का उपयोग करना एक विकल्प नहीं है , या आपको URL के साथ काम करते समय कोने के मामलों को संभालना है (जैसे कि डबल / ट्रिपल स्लैश या जटिल प्रतिस्थापन के बिना खाली लाइनें), या अतिरिक्त प्रसंस्करण का उपयोग करना, यहाँ कम स्पष्ट है, लेकिन अधिक कार्यात्मक है शैली समाधान:

const urls = [
  '//some/link///to/the/resource/',
  '/root',
  '/something/else',
];

const trimmedUrls = urls.map(url => url.split('/').filter(x => x).join('/'));

console.log(trimmedUrls);

इस स्निपेट filter()फ़ंक्शन में केवल खाली स्ट्रिंग्स (जो डिफ़ॉल्ट व्यवहार है) को फ़िल्टर करने की तुलना में अधिक जटिल तर्क को लागू कर सकता है।

वर्ड ऑफ वार्निंग - यह अन्य स्निपेट्स की तरह तेज नहीं है।


3

सिर्फ इस मामले में कि किसी को यहां समय से पहले अनुकूलन की आवश्यकता है ...

http://jsperf.com/remove-leading-and-trailing-slashes/5

var path = '///foo/is/not/equal/to/bar///'
var count = path.length - 1
var index = 0

while (path.charCodeAt(index) === 47 && ++index);
while (path.charCodeAt(count) === 47 && --count);

path = path.slice(index, count + 1)

@benraay क्या आपको इसे समझने में सहायता की आवश्यकता है?
मिलन जार्जिया

@MilenGeorgiev कोई धन्यवाद नहीं था, मैं कह रहा था कि कोड का यह संस्करण RegEx के साथ एक से भी कम पठनीय है, वे कभी-कभी समझने में कठिन होते हैं theString.replace(/^\/|\/$/g, ''), लेकिन कोड पढ़ने वाले लोगों के लिए समझना वास्तव में सरल और आसान है, लेकिन शायद इस एक की तुलना में धीमा है!
20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.