2009-04-04 12 views
8

पर एक नियमित अभिव्यक्ति को लागू करना मैं जावा I/O स्ट्रीम में नियमित अभिव्यक्ति लागू करने का एक उदाहरण चाहता हूं जो स्ट्रीम को केवल स्ट्रिंग में परिवर्तित नहीं करता है क्योंकि मैं बाइनरी डेटा को संरक्षित करना चाहता हूं। इंटरनेट डेटा पर अधिकांश उदाहरण टेक्स्ट डेटा पर ध्यान केंद्रित करते हैं ...जावा I/O स्ट्रीम

+1

आप क्या देख रहे हैं? डेटा को अस्वीकार करें जो regexp से मेल नहीं खाता है? और यदि आप तारों में रूचि नहीं रखते हैं तो आप किस पर मेल खाना चाहते हैं? कुछ स्पष्टीकरण अच्छा होगा –

+0

बस स्पष्टीकरण के लिए: वर्णों में एक रूपांतरण और बाइनरी डेटा पर वापस प्रदर्शन का असर हो सकता है लेकिन रूपांतरण के कारण एकल बाइट खो नहीं जाएगा। – rwitzel

+0

[संभवतः एक स्ट्रीम पर रेगेक्स प्रदर्शन] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3013669/performing-regex-on-a-stream) –

उत्तर

0

स्ट्रीम को बाइट सरणी में कनवर्ट करें।

+0

यह उल्लेख किया जाना चाहिए कि इनपुट केवल लोड होने पर ही यह समझ में आता है अपने आकार के दोनों शब्दों और लोडिंग के लिए जरूरी समय में स्मृति में! इसका मतलब है कि आपको एक विश्वसनीय कार्यक्रम लिखने के लिए स्ट्रीम द्वारा प्रदान किए गए डेटा की लंबाई जानने की आवश्यकता है। एक स्ट्रीम की इनपुट लम्बाई को जानना संभावित उद्देश्यहीन डेटा प्रदान करने के अपने उद्देश्य के विपरीत है! –

-2

रेगेक्स संचालन तारों पर किया जाना चाहिए, जो बाइनरी डेटा के एन्कोडेड बाइट हैं। आप डेटा के बाइट्स पर रेगेक्स ऑपरेशंस नहीं कर सकते हैं, आपको पता नहीं है कि वे क्या प्रतिनिधित्व करते हैं।

+8

-1 मैं असहमत हूं। कोई कारण नहीं है कि आप बाइनरी डेटा पर नियमित अभिव्यक्ति क्यों लागू नहीं कर सकते हैं। बाइनरी डेटा का यह मतलब नहीं है कि आपको पता नहीं है कि वे क्या प्रतिनिधित्व करते हैं। –

+0

माना जाता है कि आप 0 और 1 की धारा ले सकते हैं और उस पर रेगेक्स कर सकते हैं। हालांकि मौजूदा जावा एपीआई में से कोई भी आपको उस कच्ची धारा तक पहुंच प्रदान नहीं करता है, इसे बिना किसी सार्थक रूप में परिवर्तित किए। –

+0

+1 सहमत हैं, बाइनरी डेटा पर regexp लागू करने से कोई मतलब नहीं है। Regexps मूल रूप से स्ट्रिंग्स के लिए तैयार हैं, उन्हें स्ट्रिंग्स का उपयोग करके परिभाषित किया गया है, इसलिए आप हमेशा एक स्ट्रिंग एन्कोडिंग का उपयोग करेंगे, या तो स्पष्ट रूप से या स्पष्ट रूप से। –

9

आवश्यक कार्यक्षमता जावा मानक पर मौजूद नहीं है। आपको jakarta regexp, और विशेष रूप से, StreamCharacterIterator कक्षा का उपयोग करना होगा। यह वर्ग regexp संचालन में उपयोग के लिए एक इनपुटस्ट्रीम encapsulates।

यदि आप मानक नियमित अभिव्यक्ति पैकेज का उपयोग करना चाहते हैं, तो मैं सुझाव देता हूं कि पिछली कक्षा से स्रोत लें और के बजाय CharSequence लागू करके अनुबंध को बदलें।

+1

CharSequence को कार्यान्वित करने वाला एक मुद्दा यह है कि इंटरफ़ेस को कक्षा को 'सार्वजनिक int लंबाई()' लागू करने की आवश्यकता होती है। यदि आप किसी स्ट्रीम से पढ़ रहे हैं, तो आप लंबाई नहीं जान पाएंगे और रेगेक्स इंजन का जवाब वापस नहीं कर पाएंगे। – monkeysplayingpingpong

0

Ragel का उपयोग करने का प्रयास करें - संक्रमण कॉलबैक के साथ नियमित अभिव्यक्ति उपकरण।

स्ट्रीम और हिस्सों पर लागू किया जा सकता है।

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