2015-01-20 3 views
8

एक विषम संख्या लंबाई स्ट्रिंग में, आप मध्य चरित्र से कैसे मिलान कर सकते हैं (या कैप्चर)?रेगेक्स के साथ एक स्ट्रिंग में मध्य चरित्र से मिलान कैसे करें?

क्या यह पीसीआरई, सादा पर्ल या जावा रेगेक्स स्वाद के साथ संभव है?

.NET regex के साथ आप इसे आसानी से हल करने के लिए balancing groups का उपयोग कर सकते हैं (यह एक अच्छा उदाहरण हो सकता है)। सादे पर्ल रेगेक्स द्वारा मेरा मतलब है कि (??{ ... }) जैसी किसी भी कोड संरचना का उपयोग न करें, जिसके साथ आप कोई भी कोड चला सकते हैं और निश्चित रूप से कुछ भी कर सकते हैं।

स्ट्रिंग किसी भी विषम संख्या की लंबाई का हो सकता है।

उदाहरण के लिए स्ट्रिंग 12345 में आप स्ट्रिंग के केंद्र में वर्ण 3 प्राप्त करना चाहते हैं।

यह आधुनिक रेगेक्स स्वादों की संभावनाओं के बारे में एक प्रश्न है और किसी अन्य तरीके से ऐसा करने के लिए सर्वश्रेष्ठ एल्गोरिदम के बारे में नहीं है।

+6

पर्ल: हाँ। रिकर्सन या '/^(। *) (।) (?? {'।' X लंबाई ($ 1)} का उपयोग करना) \ z/s' – ikegami

+0

क्या यह संदर्भ-संवेदनशील नहीं है? – Oli

+0

@ikegami, मुझे लगता है कि मुझे पर्ल नहीं कहा जाना चाहिए था, या कम से कम पर्ल कोड का उपयोग नहीं करना चाहिए था। इस मामले में आप मूल स्ट्रिंग फ़ंक्शन का भी उपयोग कर सकते हैं। – Qtax

उत्तर

7
PCRE और पर्ल (और शायद जावा) के साथ

आप इस्तेमाल कर सकते हैं :

^(?:.(?=.*?(?(1)(?=.\1$))(.\1?$)))*(.) 

जो दूसरे कैप्चरिंग समूह में विषम लंबाई तारों के मध्य चरित्र को पकड़ लेगा।

Explained:

^ # beginning of the string 
(?: # loop 
    . # match a single character 
    (?= 
    # non-greedy lookahead to towards the end of string 
    .*? 
    # if we already have captured the end of the string (skip the first iteration) 
    (?(1) 
     # make sure we do not go past the correct position 
     (?= .\1$) 
    ) 
    # capture the end of the string +1 character, adding to \1 every iteration 
    (.\1?$) 
) 
)* # repeat 
# the middle character follows, capture it 
(.) 
+2

मुझे यह मिला है: '^ (?:। (? =। * ((? (1)। \ 1 |।)) $)) * \ K.' यह बहुत अलग नहीं है। –

+2

या सही मात्रात्मक के साथ: '^ (?:। (? =। + ((? (1)। \ 1 |।)) $)) * \ K.' –

+2

@CasimiretHippolyte, अच्छा समाधान, +1! आपको इसे पोस्ट करना चाहिए। – Qtax

1

हम्म, शायद किसी को एक शुद्ध regex समाधान के साथ आ सकते हैं, लेकिन यदि नहीं तो आप हमेशा गतिशील रूप से इस तरह regex बना सकते हैं:

public static void main(String[] args) throws Exception { 
    String s = "12345"; 
    String regex = String.format(".{%d}3.{%d}", s.length()/2, s.length()/2); 
    Pattern p = Pattern.compile(regex); 
    System.out.println(p.matcher(s).matches()); 
} 
संबंधित मुद्दे