2011-12-21 20 views
16

मैंने this question देखा है, और मुझे अनुभव से पता है कि हर भाषा regex की एक अलग बोली का समर्थन करने के लिए प्रतीत होता है। मुझे लगता है कि समस्या लंबे समय से आसपास रही है, इसलिए कोई इसके बारे में कुछ करना चाहता था।मैं विभिन्न प्रोग्रामिंग भाषाओं में एक ही नियमित अभिव्यक्ति का उपयोग कैसे कर सकता हूं?

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

यदि मैं किसी भी आरई बोली को चुन सकता हूं और कम से कम अर्ध-मूल रूप से सभी भाषाओं से यह कह सकता हूं, तो यह हमारे लिए एक बड़ा कदम होगा। क्या यह संभव है? क्या यह पहले से ही किया जा रहा है? हमने पीसीआरई को देखा, और यह तकनीकी रूप से जावा और रूबी (हालांकि यह ठंड में जेएस को छोड़ देता है) के मूल बाइंडिंग के माध्यम से इसे आमंत्रित करने के लिए संभव है, लेकिन मुझे वास्तव में कोई भी ऐसा नहीं मिला है। क्या हम अकेले हैं?

ईटीए: एक झुर्री मैंने उल्लेख नहीं किया है कि यह सिस्टम उपयोगकर्ता regex प्रदान करता है। (हाँ, मैं समझता हूं कि यह security issue इत्यादि है, लेकिन यह विश्वसनीय, जिम्मेदार उपयोगकर्ताओं द्वारा घर के उपयोग के लिए है।) मैं निश्चित रूप से सुझाव दे सकता हूं कि "ऐसा न करें" शक्ति-सुविधाओं से बचने के लिए, लेकिन मुझे उम्मीद है कि यह सबसे अच्छा समाधान नहीं है।

+1

आह, उपयोगकर्ता द्वारा आपूर्ति की गई नियमित अभिव्यक्तियां। मुझे पता था कि हम कुछ खो रहे थे;) – BoltClock

+0

(मैं बस स्टॉपगैप पोस्ट करना चाहता था जिसे हम किसी भी परवाह करते हैं, अगर हम परवाह करते हैं तो मैं घायल हो जाता हूं। हालांकि, मुझे अभी भी कुछ बेहतर सुनना अच्छा लगेगा।) हमने जावा रेगेक्स को चुना। हम रूबी कोड से इन्हें मूल रूप से चला सकते हैं, बशर्ते रूबी जेआरबी में चलती है। हमारे उद्देश्यों के लिए, यह काफी अच्छा है। हमने एक जावा सर्वलेट भी लिखा जो मूल रूप से एक परीक्षण सेवा के खिलाफ एक रेगेक्स चलाता है। यह जावास्क्रिप्ट अंत का ख्याल रखता है, बेशक यह सुंदर नहीं है: -/ – Coderer

उत्तर

11

आपकी पोस्ट में आपने जिन शब्दों का उल्लेख किया है, वे बहुत अलग नहीं हैं, कुछ चीजें हैं जो दूसरों द्वारा समर्थित नहीं हैं, लेकिन आमतौर पर कोई समस्या नहीं आती है जब तक आप नियमित रूप से अभिव्यक्ति नहीं लिखते हैं, जो वास्तव में विशेष रूप से लक्षित होते हैं प्रश्न में बोलीभाषाओं में से एक।

आप नीचे दिए गए लिंक में तालिका में बोलियों के बीच मतभेदों को उपलब्ध देख सकते हैं:


उन दोनों के बीच बड़ा अंतर के अधिक "उन्नत" विशेषताएं इस प्रकार हैं नियमित अभिव्यक्ति। यदि आप इनका उपयोग करने से दूर रहते हैं, तो आप सुरक्षित क्षेत्र में होंगे।


के बाद से दोनों अजगर और जावा देशी जावास्क्रिप्ट आप कह सकते हैं कि सभी भाव जावास्क्रिप्ट के लिए लिखा जाना चाहिए, और फिर भविष्य डेवलपर्स मॉड्यूल उन्हें उपलब्ध का उपयोग कर क्रियान्वित करने के लिए उपलब्ध मॉड्यूल है, यह सुनिश्चित करें कि regexp भाग गया बनाने के लिए हमेशा एक ही तरीके से काम करेंगे।

हालांकि मैं सिर्फ आपके आवेदन को दस्तावेज करता हूं कि जो भी नियमित अभिव्यक्तियों का उपयोग किया जाता है, उन्हें सभी तीन भाषाओं द्वारा समर्थित किया जाना चाहिए, और फिर उन्हें एक तालिका (जैसे कि पहले लिंक किया गया) पर निर्देशित करना है कि उन्हें यह देखना चाहिए कि वे क्या उपलब्ध हैं उपयोग करने के लिए।

.. या आप स्वयं की एक सूची/तालिका को अंपाकार कर सकते हैं।

+2

+1 उस शानदार लिंक के लिए! –

+0

सुपर कमाल लिंक, लेकिन मुझे लगता है कि वास्तव में कुछ * नहीं * उन्नत विशेषताएं हैं जो शायद मायने रखती हैं। पहली चीज जो मुझ पर कूदती है वह है [हाइफ़ेन इन [\ dz] एक शाब्दिक है - यह एक असामान्य वाक्यविन्यास नहीं है और मुझे नहीं लगता कि आप एक चरित्र वर्ग लिख सकते हैं, जब आप हाइफ़न के बारे में बात कर रहे हों, तो वह होगा जावा और रूबी दोनों के तहत समान रूप से काम करें। – Coderer

+1

देख नहीं सकता है कि क्यों कोई भी इस तरह के बयान लिखेंगे? यदि आप एक char के रूप में हाइफ़न रखना चाहते हैं और '' [] 'के अंदर एक श्रेणी ऑपरेटर नहीं है, तो यह अधिक मानक है। इसके उपयोग के संबंध में, वर्बोज़ होने के कारण अक्सर रखरखाव की भावना में बेहतर होता है, उदाहरण के लिए, मैं लोगों को [ए- \ डी] का उपयोग करने की सलाह नहीं देता हूं। –

1

बोलीभाषाएं थोड़ा अलग हैं, लेकिन वे लगभग सभी प्रमुख बिंदुओं में ओवरलैप हैं। (मुख्य मतभेद खुद को रेगेक्स में नहीं हैं, लेकिन आप उन्हें कैसे कॉल करते हैं (एक भाषा का find एक और matches है, और इसी तरह) और रेगेक्स अक्षरों के लिए समर्थन में (एक भाषा का // एक और कच्ची स्ट्रिंग बैकस्लैश की दूसरी स्ट्रिंग है) ।)

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

0

एक (हेवीवेट) विकल्प "रेगेक्सपी क्रॉस-कंपाइलर" बनाने के लिए होगा जो इनपुट के रूप में स्वीकार कर सकता है, जो कुछ कैनोलिक रूप में लिखा गया है (कहते हैं, एक पर्ल नियमित अभिव्यक्ति के रूप में), फिर स्कैन और इसे पार्स करेगा एक वाक्यविन्यास पेड़ और आउटपुट समकक्ष नियमित रूप से अन्य भाषाओं के लिए अभिव्यक्ति (कहते हैं, पायथन या जावा)। यह आपको एक बार नियमित अभिव्यक्ति लिखने देगा और इसे हर जगह काम करेगा, क्योंकि संकलक प्रारूपों के बीच परिवर्तित होने वाले सभी कार्यों को करेगा।

आशा है कि इससे मदद मिलती है!

+0

क्या मैं * लिखना * चाहता हूं? बिलकुल नहीं। बिल्कुल नहीं। लेकिन अगर आपको कभी भी यह कहीं भी तैरता हुआ लगता है, तो अपने उत्तर को अपडेट करने में संकोच न करें और मैं इसे स्वीकार करूंगा! : डी – Coderer

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

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