2010-06-15 26 views
6

मैं सामान्य रूप से "foo - bar" के स्ट्रिंग्स को "foo" और "bar" में Pattern.split() का उपयोग करके जावा नियमित अभिव्यक्ति तैयार करने की कोशिश कर रहा हूं। '-' ASCII, उन्हें-डैश, एन-पानी का छींटा, आदि मैं निम्नलिखित नियमित अभिव्यक्ति का निर्माण किया है:: - "" चरित्र कई डैश से एक हो सकताजावा नियमित अभिव्यक्तियों में यूनिकोड डैश मिलान?

private static final Pattern titleSegmentSeparator = Pattern.compile("\\s(\\x45|\\u8211|\\u8212|\\u8213|\\u8214)\\s"); 

जो, अगर मैं मैं पैटर्न दस्तावेज को सही ढंग से पढ़ रहा हूं, किसी भी यूनिकोड डैश या एसीआई डैश को कैप्चर करना चाहिए, जब दोनों तरफ सफेद जगहों से घिरा हुआ हो। मैं इस प्रकार पैटर्न का उपयोग कर रहा हूं:

String[] sectionSegments = titleSegmentSeparator.split(sectionTitle); 

कोई खुशी नहीं। नीचे नमूना इनपुट के लिए, डैश का पता नहीं लगाया गया है, और शीर्षक सेगमेंटसेपरेटर.मैटर (सेक्शनटाइट)। ढूँढें() झूठी रिटर्न देता है!

यह सुनिश्चित करने के लिए कि मुझे कोई असामान्य चरित्र संस्थाएं नहीं मिल रही हैं, मैंने कुछ डीबग जानकारी मुद्रित करने के लिए System.out का उपयोग किया। आउटपुट निम्नानुसार है - प्रत्येक वर्ण के बाद (int) char के आउटपुट का पालन किया जाता है, जो इसका 'यूनिकोड कोड पॉइंट होना चाहिए, नहीं?

नमूना इनपुट:

अध्ययन सारांश (10 में 1) - प्रतियोगिता

एस (83) टी (116) यू (117) घ (100) y (121) (32) एस (83) यू (117) एम (109) एम (109) ए (9 7) आर (114) वाई (121) (32) ((40) 1 (4 9) (32) ओ (111) एफ (102)) (32) 1 (4 9) 0 (48)) (41) (32) - (8211) (32) सी (67) ओ (111) एम (109) पी (112) ई (101) टी (116) i (105) टी (116) i (105) ओ (111) एन (110)

यह मुझे लगता है कि डैश कोडपॉइंट 8211 है, जिसे रेगेक्स द्वारा मेल किया जाना चाहिए, लेकिन यह नहीं है! यहाँ क्या चल रहा है?

+0

डॉक्स से: "तार" \ u2014 "और" \\ u2014 ", जबकि बराबर नहीं, एक ही पैटर्न है, जो हेक्साडेसिमल मान 0x2014 साथ अक्षर से मेल खाता में संकलित। " यही है, आप अपनी अभिव्यक्ति में डबल \\ को हटा सकते हैं। – aioobe

+0

@aioobe: जावा डॉक्स ने एक उदाहरण के रूप में वास्तव में एक चरित्र का उपयोग किया है कि यह सवाल इस बारे में है कि यह एक बड़ा संयोग है। या आप उद्धरण modifiy किया था? –

+2

संयोग :-) – aioobe

उत्तर

12

आप दशमलव (8211) और हेक्साडेसिमल (0x8211) मिश्रण कर रहे हैं।

\x और \u दोनों एक हेक्साडेसिमल संख्या उम्मीद करते हैं, इसलिए आप उन्हें-डैश, नहीं \u8211 (और सामान्य हाइफन आदि के लिए \x2D) मैच के लिए \u2014 उपयोग करने की आवश्यकता होगी।

लेकिन यूनिकोड संपत्ति "डैश विराम चिह्न" का उपयोग क्यों न करें?

एक जावा स्ट्रिंग के रूप में: "\\s\\p{Pd}\\s"

+0

हां, जावा यूनिकोड 'डैश' प्रॉपर्टी को इसके रेगेक्स में समर्थन नहीं करता है, जिसमें MINUS SIGN जैसी चीजें शामिल हैं, जो कि प्रतीक प्रकार है। – tchrist

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