2015-12-06 6 views
5

Regex बोली में निहित है को छोड़कर सभी सफेद स्थान को निकालना: जावास्क्रिप्टक्या कैप्चर समूह

मैं निम्नलिखित कैप्चर समूह (('|").*?[^\\\2]\2) कि एक उद्धृत स्ट्रिंग बच गए उद्धरण को छोड़कर का चयन करता है।

उदाहरण के लिए इन मेल ...

"Felix's pet" 
'Felix\'s pet' 

हालांकि मैं अब इस पद्धति से मिलता जुलता कुछ को छोड़कर एक स्ट्रिंग से सभी सफेद स्थान को निकालना चाहते हैं। क्या कैप्चर समूह \1 पर वापस संदर्भित करने का कोई तरीका है और फिर इसे मैचों से बाहर कर दें?

मैंने अपने सीमित RegEx ज्ञान के साथ ऐसा करने का प्रयास किया है, लेकिन अब तक मैं केवल पैटर्न के पहले या बाद में स्थान का चयन कर सकता हूं।

यदि आप मेरे उदाहरण के साथ खेलना चाहते हैं तो मैंने सुविधा के लिए regexr पर अपनी टेस्ट स्क्रिप्ट सहेजी है।

परिणाम के इरादे से:

key : string हो जाता है key:string

dragon : "Felix's pet" हो जाता है dragon:"Felix's pet"

"Hello World" something here "Another String"

हो जाता है

"Hello World"somethinghere"Another String"

आदि ...

+0

@anubhava: मैं डुप्ली वोट से असहमत हूं - स्वीकार्य उत्तर उस रणनीति का उपयोग करता है जो केवल उस प्रश्न में विशेष स्ट्रिंग संरचना के साथ काम करता है, और आपका (बेहतर) उत्तर बच निकले उद्धरणों के साथ विफल रहता है। फिर से खोलने के लिए मतदान। –

+0

@TimPietzcker: पर्याप्त मेला, मुझे यकीन है कि एक बेहतर डुप्लिकेट है लेकिन मुझे बस मेरी खोज का उपयोग नहीं मिल सका। – anubhava

+2

@SnareChops: आपका रेगेक्स बचने वाले उद्धरणों को ध्यान में रखने की कोशिश कर रहा है, लेकिन यह गलत तरीके से करता है (आपकी चरित्र श्रेणी गलत है, और यहां तक ​​कि अगर यह काम करती है, तो आपको केस 'foo \\' 'पर विचार करना चाहिए जहां बैकस्लैश है समापन उद्धरण से पहले, लेकिन यह एक भागने वाली बैकस्लैश नहीं है। क्या आपको ऐसे मामले को संभालने की आवश्यकता होगी? –

उत्तर

2

यह बहुत नियमित अभिव्यक्ति के साथ क्या करना कठिन है। निम्नलिखित काम करता है:

result = subject.replace(/ (?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)/g, ""); 

मैं एक of my earlier answers to a similar, but not identical question से इस उत्तर का निर्माण किया है; इसलिए मैं आपको स्पष्टीकरण के लिए इसका उल्लेख करूंगा।

आप इसे live on regex101.com का परीक्षण कर सकते हैं।

0

जावास्क्रिप्ट में, आप String.replacefunction as parameter के साथ उपयोग कर सकते हैं। तो आप मिलान करने वाले समूहों को परिभाषित करते हैं और फिर आप उनमें से प्रत्येक को अलग से बदल सकते हैं।

आप सभी सफेद रिक्त स्थान

\s+ 

से मेल चाहते हैं और आप से मेल सभी के अंदर उद्धरण

(('|")(?:[^\\]\\\2|.)*?\2) 

जरूरत है, तो आप इसे एक साथ

var pattern = /\s+|(('|")(?:[^\\]\\\2|.)*?\2)/g 

गठबंधन और आप लिखते हैंपैरामीटर रूप गुमनाम समारोह के साथ बयान बदल देते हैं:

var filteredString = notFilteredString.replace(pattern, 
     function(match, group1) { return group1 || "" }) 
प्रत्येक मैच समारोह स्ट्रिंग की जगह देने के लिए कहा जाता है के साथ

। रेगेक्सपी या तो सफेद स्थान या उद्धरण की सामग्री से मेल खाता है। उद्धरण की सामग्री को group1 के रूप में लपेटा गया है और अज्ञात फ़ंक्शन group1 देता है यदि group1 मिलान किया गया है या "" सफेद रिक्त स्थान या किसी अन्य मैच के लिए कुछ भी नहीं है।

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