/ / Regex URL में स्लैश के बीच स्ट्रिंग को दोहराते हुए - जावा, रेगेक्स, स्ट्रिंग

यूआरएल - जावा, रेगेक्स, स्ट्रिंग में स्लैश के बीच रेगेक्स दोहराव स्ट्रिंग कैप्चर करें

मेरे पास आंशिक URL है जो हो सकता है

/ यह / xyz/ परीक्षण / परम + 1 / परम -2 / 1234 / gfd4

मूल रूप से शुरुआत में दो अक्षर एक स्लैशएक और अज्ञात स्ट्रिंग और फिर स्लैश के बीच दोहराए जाने वाले तारों की एक श्रृंखला मुझे हर स्ट्रिंग को पकड़ने की आवश्यकता है (मुझे पता है कि / स्प्लिमिटर के साथ एक विभाजन ठीक होगा लेकिन मुझे यह जानने में दिलचस्पी है कि मैं रेगेक्स के साथ कैसे निकाल सकता हूं)। मैं इसके साथ पहले बाहर आया था:

^/([a-zA-Z]{2})/([a-zA-Z]{1,10})(/[a-zA-Z1-9+-]+)

लेकिन यह केवल कब्जा है

group1: यह समूह 2: xyz group3: / परीक्षण

और निश्चित रूप से यह बाकी स्ट्रिंग की अनदेखी करता है।

अगर मैं अंत में एक * चिन्ह जोड़ता हूँ तो यह केवल अंतिम वाक्य को दर्शाता है:

^/([a-zA-Z]{2})/([a-zA-Z]{1,10})(/[a-zA-Z1-9+-]+)*

group1: यह समूह 2: xyz group3: / gfd4

इसलिए, मैं स्पष्ट रूप से कुछ बुनियादी बातों को याद कर रहा हूं, इसलिए उचित रेगेक्स के अलावा मैं एक स्पष्टीकरण देना चाहूंगा।

मैंने जावा के रूप में टैग किया क्योंकि इंजन जो रेगेक्स को पार्स करता है वह जेडीके 7 है। यह मेरा ज्ञान है कि प्रत्येक इंजन में अंतर हो सकता है।

उत्तर:

जवाब के लिए 0 № 1

जैसा यहां उल्लेख किया गया है, यह अपेक्षित है:

पैटर्न में एक समूह के साथ, आप केवल उस समूह में एक सटीक परिणाम प्राप्त कर सकते हैं।
यदि आपका कैप्चर समूह पैटर्न द्वारा दोहराया जाता है (आपने आस-पास के गैर-कैप्चरिंग समूह पर + क्वांटिफायर का उपयोग किया है), केवल अंतिम मान जो इसे संग्रहीत करता है।

मैं बजाय group3 में स्ट्रिंग के बाकी पर कब्जा होगा ((/.*$), जैसा इस डेमो में), फिर "/" के आसपास एक विभाजन का उपयोग करें। या बाकी स्ट्रिंग पर yhat पैटर्न लागू करें:

Pattern p = Pattern.compile("(/[a-zA-Z1-9+-]+)");
Matcher m = p.matcher(str);
while (m.find()) {
String place = m.group(1);
...
}