2010-07-21 4 views
9

मैं एक regex अभिव्यक्ति है कि एक स्ट्रिंग को पार करता है और 40 मूल्यों बाहर खींचती है वापस करने के लिए अभिव्यक्ति, ऐसा लगता है प्रकार यदि क्वेरी के नीचे है, लेकिन बहुत बड़ा और अधिक जटिल की तरहRegex 9 से अधिक मूल्यों को संदर्भित एक में बदलने के

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test> 

मेरा प्रश्न यह है कि जब मैं संख्या 9 से अधिक हो तो प्रतिस्थापन कमांड के साथ इन अभिव्यक्तियों का उपयोग कैसे करूं। ऐसा लगता है कि जब भी मैं \10 का उपयोग करता हूं तो यह \1 के लिए मान देता है और फिर 0 अंत में जोड़ता है।

किसी भी मदद की बहुत सराहना की जाएगी धन्यवाद :)

इसके अलावा, मैं UEStudio उपयोग कर रहा हूँ, लेकिन एक अलग कार्यक्रम बेहतर तो करता है, तो कोई बड़ी बात नहीं है :)

+5

सब्लिमे टेक्स्ट में, "\ 10" या तो काम नहीं करता है, लेकिन "$ 10" काम करता है। –

उत्तर

3

सरल Regex इंजन के अधिकांश संपादकों द्वारा प्रयोग किया जाता 10 से अधिक मिलान समूहों को संभालने के लिए सुसज्जित नहीं हैं; यह अल्ट्राएडिट कैन की तरह प्रतीत नहीं होता है। मैंने अभी नोटपैड ++ की कोशिश की है और यह मैच 10 समूहों के साथ एक regex भी नहीं होगा।

आपकी सबसे अच्छी शर्त, मुझे लगता है कि एक सभ्य रेगेक्स पार्सर के साथ त्वरित भाषा में कुछ तेजी से लिखना है। के रूप में पूछा

लेकिन इस सवाल का जवाब नहीं होता यहाँ पायथन में कुछ: आदेश समूह 2 एक शाब्दिक द्वारा पीछा करने के लिए एक backreference पाने के लिए:

import re 

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)') 
with open('input.txt', 'r') as f: 
    for line in f: 
     m = pattern.match(line) 
     print m.groups() 

ध्यान दें कि अजगर ऐसे \20 रूप backreferences की अनुमति देता है 0, आपको \g<2>0 का उपयोग करने की आवश्यकता है, जो स्पष्ट नहीं है।

संपादित करें:, परीक्षण

abcdefghijklmnop 
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.) 
note: 1 2 3 4 5 6 7 8 9 10 11 12 13 
value: a b c d e f g h i j k l m 
replace result: 
    \11  k1  i.e.: match 1, then the character "1" 
    ${12} l  most should support this 
    ${name} l  few support named references, but use them where you can. 

नाम संदर्भ regex पुस्तकालयों के बहुत विशिष्ट स्वाद में आमतौर पर केवल संभव हो रहे हैं: regex के अधिकांश जायके, और संपादकों जो एक regex इंजन में शामिल हैं, वाक्य रचना की जगह के रूप में इस का पालन करना चाहिए निश्चित रूप से जानने के लिए आपका उपकरण।

+2

"कुछ लोग, जब किसी समस्या का सामना करते हैं, तो सोचें" मुझे पता है, मैं नियमित अभिव्यक्तियों का उपयोग करूंगा। "अब उन्हें दो समस्याएं हैं।" - जेमी ज़विंस्की उपरोक्त उद्धरण कभी भी इतना सही नहीं लग रहा था :( सहायता के लिए धन्यवाद :) –

1

यदि आप 9 से अधिक उपसमूहों को संभाल नहीं सकते हैं तो शुरुआत में 9 के समूह से मिलान क्यों नहीं करते हैं और फिर लूप और उन मैचों में रेगेक्स लागू करते हैं?

अर्थात पहला मैच (<test.*/test>)+ और फिर <test(.*)/test> पर प्रत्येक उपसमूह मैच के लिए।

+0

दुर्भाग्य से मेरे मामले में जो काम नहीं करेगा, पैटर्न बहुत बड़ा है। हालांकि मैं सुझाव की सराहना करता हूं। धन्यवाद :) –

9

रूप psycho brm द्वारा ने कहा: $ 10 के बजाय \ 10 का प्रयोग करें मैं Notepad का उपयोग कर रहा ++ और यह सुंदर काम करता है।

1

नामित समूहों का उपयोग करने का प्रयास करें; इसलिए दसवें बजाय:

(.*) 

उपयोग:

${group10} 

(यही कारण है कि पाशन का उपयोग कर एक बेहतर समाधान के अभाव में निश्चित रूप से है:

(?<group10>.*) 

और फिर निम्न की जगह स्ट्रिंग का उपयोग , और याद रखें कि आपके पर्यावरण के आधार पर विभिन्न रेगेक्स सिंटैक्स स्वाद हो सकते हैं।)

+0

यह मेरे लिए काम करता है जब nginx में regex मिलान का उपयोग करते हैं, जो 9 से अधिक समूहों से मेल खाने जैसा प्रतीत नहीं होता है। ओपी में वही समस्या है जहां $ 10 को $ 1 + 0 के रूप में व्याख्या किया जाता है। – theChumpus

0

दो अंकों के उपसमूह के सामने $ डाल दिया: उदा। \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 $ 10 यह मेरे लिए काम किया।

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