2011-01-09 18 views
5

में दूसरी घटना की जगह इस स्ट्रिंग का एक उदाहरण है कि के साथ काम किया जा रहा है है:Regex (नियमित अभिव्यक्ति), जावास्क्रिप्ट

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx] 

मैं एक छोटे से एक मैच की दूसरी घटना मिलान समस्या हो रही है मैं दूसरे नंबर के साथ दूसरे वर्ग के ब्रैकेट को वापस करना चाहते हैं। मैं कुछ एक स्ट्रिंग में संख्या के साथ पहले वर्ग backets खोजने regex है:

\[+[0-9]+\] 

यह रिटर्न [7], हालांकि मैं वापस करना चाहते [9]।

(?:.*?(\[+[0-9]+\])){2} 

:

मैं जावास्क्रिप्ट के बदलने के समारोह का उपयोग कर रहा है, तो निम्न regex दूसरी घटना ([9]) regex testeing क्षुधा में, हालांकि इसे सही ढंग से जावास्क्रिप्ट में जगह नहीं है समारोह की जगह से मेल खाता है मेरा सवाल यह है कि मैं जावास्क्रिप्ट में [9] को प्रतिस्थापित करने के लिए उपरोक्त रेगेक्स का उपयोग कैसे करूं या क्या कोई अन्य रेगेक्स है जो वर्ग ब्रैकेट में किसी संख्या की दूसरी घटना से मेल खाता है।

चीयर्स!

उत्तर

3

तो xxx बस किसी भी स्ट्रिंग, और जरूरी नहीं एक संख्या है, तो यह तुम क्या चाहते हो सकता है:

(\[[0-9]+\]\[.*?\])\[([0-9]+)\] 

यह [] में दूसरे नंबर के लिए लग रहा है। इसे $1[<replacement>] के साथ बदलें। Play with it on rubular

आपका रेगुलर एक्सप्रेशन उद्देश्य के अनुसार कार्य करने में विफल रहता है क्योंकि + के बाद समूह केवल पिछले[xxx] पकड़े जाते हैं।

+0

आप क्वांटिफ़ायर के रूप में '{3}' का उपयोग क्यों कर रहे हैं? ऐसा लगता है कि "हम चाहते हैं कि पहले से तीन टैग हमेशा हों, और एक स्थिति के बाद, क्या आप पूछताछकर्ता द्वारा दी गई वास्तविक आवश्यकताओं पर रेगेक्स का आधार नहीं लेना चाहिए? व्यक्तिगत रूप से, मैं '/ (\ [\ d + \] (?: \ [। *? \ D। *? \]) *) (\ [\ D + \])/\ 1 [प्रतिस्थापन] /' –

+0

@ Anon हम नहीं जानते कि 'xxx' एक संख्या नहीं है। मुझे लगता है कि यह था, लेकिन शायद मैं गलत हूँ। – marcog

+0

मैंने एक और रेगेक्स जोड़ा है जो दूसरे '[] 'को प्रतिस्थापित करेगा। – marcog

1

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]"); 

प्रयास करें एक टिप्पणी की regex के रूप में:

(  # capture the following in backref 1: 
\[\d\] # first occurrence of [digit] 
\[  # [ 
[^\]]+ # any sequence of characters except ] 
\]  # ] 
)  # end of capturing group 
\[\d\] # match the second occurence of [digit] 

पहले और दूसरे [digit] समूह के बीच [xxx] समूहों की संख्या चर रहा है, तो का उपयोग

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]"); 

तकसे मेल खाने वाले भाग के आस-पाससमूह (गैर-कैप्चरिंग) कोष्ठक और आलसी क्वांटिफायर *? मैं रेगेक्स इंजन को उन समूहों में से कुछ के रूप में मिलान करने के लिए कह रहा हूं, जितना संभव हो उतना आवश्यक है, इसलिए अगला समूह [digit] समूह है।

0
console.log("xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2) 

रिटर्न:

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx] 

जहां [n] के अंदर की संख्या के साथ कोष्ठक के 1 समूह द्वारा preceeded है यह मेल खाएगी।

+0

यह सुनिश्चित नहीं है कि यह महत्वपूर्ण है, लेकिन यह [1] [2] [3] पर विफल रहता है - अंतिम [3] को प्रतिस्थापित करता है। शायद ओपी कुछ परीक्षण प्रदान करना चाहिए ... – Hemlock

संबंधित मुद्दे