जावास्क्रिप्ट में कोष्ठक के बीच एक स्ट्रिंग प्राप्त करने के लिए नियमित अभिव्यक्ति


177

मैं एक नियमित अभिव्यक्ति लिखने की कोशिश कर रहा हूं जो एक स्ट्रिंग देता है जो कोष्ठक के बीच है। उदाहरण के लिए: मैं उस तार को प्राप्त करना चाहता हूं जो तार के बीच रहता है "(" और ")"

I expect five hundred dollars ($500).

लौटूंगा

$500

जावास्क्रिप्ट में दो तारों के बीच एक स्ट्रिंग प्राप्त करने के लिए नियमित अभिव्यक्ति मिली

लेकिन मैं regex के साथ नया हूँ। मुझे नहीं पता कि कैसे regexp में '(', ') का उपयोग करना है



आप डॉलर-साइन के परीक्षण के लिए थोड़ा संशोधित करके नीचे दिए गए गो-ओलेग के घोल का उपयोग कर सकते हैं:var regExp = /\(\$([^)]+)\)/;
डोम डे

जवाबों:


460

आपको बच निकलने वाले (के साथ \) कोष्ठकों का एक सेट बनाने की आवश्यकता है (जो कोष्ठक से मेल खाते हैं) और नियमित रूप से कोष्ठकों का एक समूह जो आपके कैप्चरिंग समूह का निर्माण करते हैं:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

टूट - फूट:

  • \( : एक शुरुआती कोष्ठक से मेल खाते हैं
  • ( : समूह पर कब्जा करना शुरू करें
  • [^)]+: एक या अधिक गैर )वर्णों का मिलान करें
  • ) : कैप्चरिंग ग्रुप
  • \) : समापन कोष्ठक

यहाँ RegExplained पर एक दृश्य विवरण है


12
+1 नाइस, एक आकर्षण की तरह काम किया। मैं आपको एक दृश्य विवरण के लिए इस smallurl.com/mog7lr3 को अपने साथ जोड़ना चाहूंगा ।
प्रवीण

5
@ user1671639: अपडेट किया गया। लिंक के लिए धन्यवाद!
गो-सेलेग

5
यह काम नहीं करता है यदि आप जिस कोष्ठक को पकड़ना चाहते हैं, उसके भीतर कोष्ठक हैं। जैसे: "मुझे पांच सौ डॉलर ($ 500 (लेकिन मुझे पता है कि मैं उस पैसे को फिर कभी नहीं देखूंगा)) की उम्मीद है।"
JayB

1
यह रीगेक्स केवल तभी काम करता है जब स्टिंग प्रति एक उदाहरण से मेल खाता हो। /gउम्मीद के मुताबिक वैश्विक झंडे का इस्तेमाल नहीं करेंगे।
सिल्कअडमिन

2
यदि आप नीचे दिए गए कोष्ठक के अंदर कई तार हैं तो क्या समाधान है: "मुझे उम्मीद है (पांच) सौ डॉलर ($ 500)" चलो कहते हैं कि मैं उन विशेष तारों की एक सरणी चाहता हूं।
मोहम्मद अल आसमर

33

स्ट्रिंग हेरफेर का प्रयास करें:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

या रेगेक्स ( जो ऊपर की तुलना में कुछ धीमा है )

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}

7
Chrome 59.0.3071 में आज उस jsperf को चलाने पर, रेक्सक्स 8% तेज था
एलेक्स मैकमिलन

9

पोर्टेड Mr_Green का जवाब एक कार्यात्मक प्रोग्रामिंग शैली के लिए अस्थायी वैश्विक चर का उपयोग से बचने के लिए।

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })

जिसे मैं ढूंढ रहा था। stackoverflow.com/questions/49614116/…
wobsoriano

8

सरल उपाय

सूचना : इस समाधान का उपयोग इस प्रश्न में स्ट्रिंग की तरह केवल एकल "(" और ")" वाले तारों के लिए किया जा सकता है।

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

ऑनलाइन डेमो (jsfiddle)


5

मुद्रा संकेत के बाद सिर्फ अंकों के लिए: \(.+\s*\d+\s*\)काम करना चाहिए

या \(.+\)कोष्ठक के अंदर कुछ के लिए


2
यह सैंपल टेक्स्ट के लिए काम करेगा, हालांकि अगर )बाद में स्ट्रिंग I expect five hundred dollars ($500). (but I'm going to pay).में लालच की तरह एक और दिखाई देता है तो +यह बहुत अधिक पकड़ लेगा।
Ro यो Mi

@ डेनोमेल्स तो आप उन तारों के दोनों उदाहरणों को कैसे पकड़ेंगे। आदर्श रूप से मैं कुछ ऐसा ही कर रहा हूं, लेकिन मैं चाहता हूं: ($500)और (but I'm going to pay) मिलान किया जाए लेकिन दो अलग-अलग मैचों में एक ही मैच आइटम माना जा रहा है? अग्रिम में धन्यवाद!
टॉम बर्ड

(। +) मेरी आवश्यकता के लिए काम किया। "डनहिल (बॉटल / पैकेट / पॉट / शॉट)" जैसे सामान पर कब्जा करने की जरूरत है और सिर्फ "डनहिल"
लौटें

5

आपके द्वारा उपयोग किए जा सकने वाले किसी भी आंतरिक कोष्ठक को छोड़कर कोष्ठक के अंदर एक सबस्ट्रिंग का मिलान करने के लिए

\(([^()]*)\)

पैटर्न। देखें regex डेमो

जावास्क्रिप्ट में, इसका उपयोग करें

var rx = /\(([^()]*)\)/g;

पैटर्न विवरण

  • \(- एक (चार
  • ([^()]*)- कैप्चरिंग ग्रुप 1: किसी भी 0 या अधिक वर्णों के अलावा और से मेल खाने वाला एक नकारात्मक चरित्र वर्ग()
  • \)- एक )चार।

पूरे मैच को प्राप्त करने के लिए, समूह 0 मान को पकड़ो, यदि आपको कोष्ठक के अंदर पाठ की आवश्यकता है, तो समूह 1 मान को पकड़ो।

अधिकांश अप-टू-डेट जावास्क्रिप्ट कोड डेमो (उपयोग करते हुए matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

लीगेसी जावास्क्रिप्ट कोड डेमो (ES5 आज्ञाकारी):


यह रेगेक्स महान है क्योंकि यह केवल ()और साथ ही साथ साइड कंटेंट को कैप्चर करता है ()()
limitlessloop

1
@limitlessloop चूंकि यह एक उपयोगी उत्तर लगता है, इसलिए मैंने एक नया matchAllआधारित जावास्क्रिप्ट कोड डेमो भी जोड़ा ।
विकटोरिया स्ट्राइब्यूव


2

वैकल्पिक:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

यदि आपको आवश्यकता हो तो चौकोर या घुंघराले कोष्ठक से कोष्ठक को बदलना संभव है


1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

$ के साथ शुरू होने वाले पहले नंबर से मेल खाएगा और उसके बाद ')'। ')' मैच का हिस्सा नहीं होगा। पहले मैच के साथ कोड अलर्ट।

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

यह कोड सभी मैचों के साथ अलर्ट करता है।

संदर्भ:

"=? n" के लिए खोज http://www.w3schools.com/jsref/jsref_obj_regexp.asp

"x (; = y)" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

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