2011-04-12 13 views
7

है, मैं एक निश्चित शब्द वाले सभी तारों से मेल खाना चाहता हूं। जैसे:नियमित अभिव्यक्ति जिसमें यूनिकोड शब्द

String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$) 

हालांकि, पैटर्न वर्ग यह संकलन नहीं करता है:

java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 39 
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 

मैं पहले से ही परम संकलन करने unicode_case निर्धारित करते हैं, यकीन नहीं है कि क्या गलत यहाँ

final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE| Pattern.CANON_EQ); 

के लिए धन्यवाद जा रहा है मदद! :)

+1

आपके त्रुटि संदेश में पैटर्न * में * दो अतिरिक्त होते हैं) - क्या त्रुटि संदेश या आपकी पोस्ट गलत है? – Erik

+1

आपको ** ** \ W', '\ w',' \ s', '\ d',' \ b', '\ p {alpha} 'का उपयोग नहीं करना चाहिए, न ही किसी अन्य चरित्र-वर्ग का उपयोग करना चाहिए जावा regexs में शॉर्टकट, क्योंकि जावा regex लाइब्रेरी [यूनिकोड नियमित अभिव्यक्ति की औपचारिक आवश्यकताओं] के साथ अनुपालन नहीं है (http://unicode.org/reports/tr18/#Compatibility_Properties)। आप '[\ pL \ pM \ p {Nd} \ p {Nl} \ p {पीसी}]' और '\ W' के साथ' \ w' अनुकरण कर सकते हैं '[^ \ pL \ pM \ p {Nd} \ पी {एनएल} \ पी {पीसी}] 'अगर आपको संलग्न_अल्फ़ान्यूमेरिक्स की परवाह नहीं है।या आप एक रेगेक्स लाइब्रेरी या भाषा का उपयोग कर सकते हैं जो यूनिकोड मानक का अनुपालन करता है। इसका मतलब है आईसीयू रेगेक्स लाइब्रेरी को कॉल करना, या पर्ल के इत्यादि को कॉल करना आदि। – tchrist

+0

क्या आपने 'जावा-एन्कोडिंग यूटीएफ -8'' के साथ संकलित किया था? – tchrist

उत्तर

0
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 
(   )((   )( ) ) ) )( ) 

पैटर्न अपने त्रुटि संदेश में नियमित अभिव्यक्ति में दो अतिरिक्त ')'

+0

हां, लेकिन वह त्रुटि संदेश क्यों प्राप्त करता है? उनकी मूल अभिव्यक्ति में कोई अनैच ब्रांड्स नहीं हैं। – aioobe

+0

उम, नहीं। वह \ W' आपके दिन को बर्बाद करने जा रहा है। – tchrist

+0

@aioobe: अच्छा सवाल। हम नहीं जानते क्योंकि उन्होंने सटीक जावा कोड पोस्ट नहीं किया है जो उसके 'स्ट्रिंग रेगेक्स' वैरिएबल को प्रारंभ करता है। – tchrist

0

यूनिकोड वर्ण है एक tricky business है।

यहाँ Pattern के प्रलेखन से एक पैरा है:, यूनिकोड नियमित अभिव्यक्ति के दिशा निर्देशों के साथ हालांकि समर्थन के अपने दूसरे स्तर को लागू करने:

यूनिकोड समर्थन

इस वर्ग इस प्रकार यूनिकोड तकनीकी रिपोर्ट # 18 थोड़ा अलग कंक्रीट वाक्यविन्यास।

जावा स्रोत कोड में \u2014 जैसे यूनिकोड एस्केप अनुक्रम जावा भाषा विशिष्टता के 3.3 में वर्णित अनुसार संसाधित किए गए हैं। इस तरह के बचने के अनुक्रमों को नियमित रूप से नियमित अभिव्यक्ति पार्सर द्वारा भी लागू किया जाता है ताकि यूनिकोड से बचने वाले अभिव्यक्तियों में उपयोग किया जा सके जो फ़ाइलों या कीबोर्ड से पढ़े जाते हैं। इस प्रकार तार "\u2014" और "\\u2014", बराबर नहीं, उसी पैटर्न में संकलित, जो हेक्साडेसिमल मान 0x2014 के साथ वर्ण से मेल खाता है।

इस प्रकार, के बाद से हम जानते हैं:

  • = \u3049
  • = \u30B9
  • = \u30D1

उचित तरीके पैटर्न आप के बाद कर रहे हैं लिखने के लिए है:

String regex = "(?:\\P{L}|\\W|^)(\\u30d9\\u30B9\\u30D1)(?:\\b|$)"; 

अतिरिक्त पठन:

+0

नहीं, मैं माफी चाहता हूँ, लेकिन उस दस्तावेज़ ** झूठ **। विश्वास करो, मुझे यह करता है। जावा भी नहीं है स्तर -1 अनुरूप, चलो अकेले स्तर -2 जिस तरह से यह दावा करता है। मैं के साथ काम कर रहा है । JDK7 लोगों को, और वे अब समझ कैसे बुरी तरह से निहित है आप उन चीजों का उपयोग करना चाहिए नहीं ईमानदार सभी RL1.2a बातें जावा में पर्दाफाश कर रहे हैं;।। यह केवल 3 RL1.2 के लिए आवश्यक 11 गुण से बाहर की आपूर्ति, यह कर सकते हैं 'टी भी RL1.1 सही है। गंभीर बातें इसके साथ गलत के बहुत सारे हैं। यह भी स्तर 1 सहायता प्रदान करने के करीब नहीं आती है। – tchrist

+0

Lol, आप * बेहतर कुछ भी * नहीं है ऐसा करने के लिए, की तुलना में इंतजार कर के आसपास बैठते हैं एक regexp सवाल पॉप अप करने के लिए जो आप के बारे में शिकायत कर सकते हैं? तुम बस के बारे में हर regexp सवाल पर दिखाने, बताया गया हो कि टूटा जावा नियमित अभिव्यक्ति कर रहे हैं। क्यों नहीं तुम सिर्फ जब तक आप वास्तव में सवाल का जवाब जानने चुप हैं? – aioobe

+1

वह * जवाब जानता है। इस बिंदु पर, वह जानता है कि कोई भी जवाब जो उल्लेख नहीं करता है जावा के रेगेक्स समर्थन को कितनी बुरी तरह खराब कर दिया गया है, गलत है। और वह सिर्फ शिकायत नहीं कर रहा है, उसने कई बार बताया है कि जावा के रेगेक्स वर्गों के साथ यूनिकोड को सही ढंग से कैसे मिलान किया जाए। लेकिन यह बहुत सारी जानकारी है, और उसे हर बार इसे पोस्ट करने की उम्मीद नहीं की जा सकती है। –

1

जो दिखाया स्ट्रिंग regex की तरह कुछ भी नहीं लग रहा है यह देखते हुए त्रुटि संदेश, से, मुझे लगता है कि यह निष्कर्ष निकाल मूल पैटर्न अनिवार्य रूप से निम्नानुसार था, जिसे मैंने सुधार करने की स्वतंत्रता ली है, प्रतीकात्मक स्थिरांक जोड़ना है, और इसके साथ प्रस्तावना रेखा संख्याएं जिन्हें हम अधिक आसानी से निरीक्षण और संबोधित कर सकते हैं।

(सभी गैर तुच्छ पैटर्न हमेशा(?x) मोड में लिखा जाना चाहिए -। भले ही जावा यहाँ आप के खिलाफ लड़ता है, तो आप अभी भी यह करना चाहिए)

1  (?: \P{L} | \W | ^) 
    2  (
    3   (?: \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU} 
    4   | \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU} 
    5   | \N{KATAKANA LETTER HE} \N{KATAKANA LETTER ZU} 
    6  ) 
    7   (?: \N{KATAKANA LETTER PA}) 
    8  | 
    9    \N{KATAKANA LETTER PA} 
10 ) 
11 | 
12    \N{KATAKANA LETTER HA} 
13 ) 
14  \N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK} 
15 ) 
16  (?: \b | $) 

पहली और आखिरी लाइनों गलत कर रहे हैं, लेकिन वे अर्थात् जावा के टूटे हुए रेगेक्स से संबंधित तरीके से गलत हैं। वे वाक्य रचनात्मक रूप से गलत नहीं हैं। वे कोई खुला कोष्ठक इसी है

के रूप में अब स्पष्ट होना चाहिए, वाक्यात्मक मुद्दा यह है कि लाइनों 13 और 15 पर खुले कोष्ठक नकली हो रहा है।

के होते हुए भी, मैं अभी भी समझने के लिए यह क्या आप वास्तव में यहाँ करने के लिए कोशिश कर रहे हैं कोशिश कर रहा हूँ पहली और आखिरी लाइनों। लाइन 3 और 4 की नकल क्यों? यह कुछ भी उपयोगी नहीं करता है। और मैं लाइन 7.

पर समूह के लिए कोई कारण नहीं आशय के संयोजन निशान पूर्ववर्ती बातों में से किसी को लागू करने के लिए अनुमति देने के लिए है देख सकते हैं?

पहली और आखिरी लाइनों में त्रुटियों के लिए के रूप में, मुझे समझ नहीं है कि एक साधारण शब्द सीमा सब है कि आप के लिए देख रहे हैं? क्या आप वास्तव में उन सीमाओं को अपने मैच के हिस्से के रूप में शामिल करना चाहते हैं, या आप बस सीमाएं स्थापित करने की कोशिश कर रहे हैं? आप एक गैर-पत्र या गैर-शब्द क्यों कह रहे हैं?

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

यदि आपने केवल कुछ ऐसा किया जो वास्तव में यूटीएस # 18 के अनुरूप था, तो यह ठीक काम करेगा, लेकिन जैसा कि मुझे लगता है कि आपने नहीं किया है (मैंने आईसीयू का कोई उल्लेख नहीं सुना है), हमें इसे लाइनों के साथ ठीक करना होगा मेरे पास previously outlined है।

या तो एक गैर शब्द या स्ट्रिंग की शुरुआत के लिए एक नजर डालें, पहले के लिए काम करेगा, और एक गैर शब्द या स्ट्रिंग के अंत के लिए एक लुकहेड आखिरी के लिए काम करेगा। यही कारण है कि \b पाठ्यक्रम चाहिए जब शब्द पात्रों का सामना करना पड़ तुम यहाँ है के रूप में करने के लिए की है, और यह भी प्रदान की जाती है कि आप अपने गैर शब्द कण के स्पष्ट रहना कि जिस तरह से बाहर काम कर सकते हैं।

लेकिन जब तक मैं मूल उद्देश्य के अधिक देख सकते हैं, मुझे नहीं लगता कि मैं और अधिक कहना चाहिए है।

0

UNICODE_CHARACTER_CLASS मोड भी एम्बेडेड झंडा अभिव्यक्ति (? यू) के माध्यम से सक्रिय किया जा सकता

कोशिश:

(?U)(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 

लेकिन पहले अपने कोष्ठक ठीक है कि मैं क्या आप में या बाहर चाहते हैं पता नहीं है के रूप में मध्य समूह में