2010-09-24 11 views
5

मुझे आज पूछा गया कि स्ट्रिंग की सूची लेने के लिए लाइब्रेरी थी और केवल उन तारों से मेल खाने के लिए सबसे कुशल रेगेक्स की गणना करने के लिए। मुझे लगता है कि यह एक NP Complete problem है, लेकिन मुझे लगता है कि हम इस क्षेत्र को थोड़ा सा परिष्कृत कर सकते हैं।रेगेक्स या पैटर्न को सरल बनाना

मैं कैसे उत्पन्न करूं और को अपने नेटवर्क पर सभी होस्टों के बड़े सेट से होस्ट के सबसेट से मिलान करने के लिए एक रेगेक्स को सरल बना सकता है? (यह जानकर कि मुझे सबसे कुशल regex नहीं मिल सकता है।)

पहला कदम आसान है। निम्नलिखित सूची से;

  • appserver1.domain.tld
  • appserver2.domain.tld
  • appserver3.domain.tld

मैं जोड़ सकते हैं और उन्हें

appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\.domain\.tld 

में भाग और मुझे पता है

में रेगेक्स को मैन्युअल रूप से सरल कैसे करें
appserver[123]\.domain\.tld 

वहां से मैं मेजबान की पूरी सूची के खिलाफ उस पैटर्न का परीक्षण कर सकता हूं और सत्यापित कर सकता हूं कि यह केवल चयनित 3 होस्ट से मेल खाता है। मुझे नहीं पता कि सरलीकरण प्रक्रिया को स्वचालित कैसे करें। क्या कोई पुस्तकालय है (पर्ल, जावास्क्रिप्ट या सी # में) या सामान्य प्रथाएं?

धन्यवाद

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

उत्तर

9

Regexp::Assemble::Compressed/Regexp::AssemblePreSuf तुलना में कहीं अधिक चाल पता:

सार के शब्दों में। R::A कमांड लाइन उपकरण assemble (डिफ़ॉल्ट रूप से स्थापित नहीं) के साथ आता है जो भवन को फिर से आसान बनाता है।

7

Regex::PreSuf मॉड्यूल बिल्कुल ऐसा करने के लिए डिज़ाइन किया गया है।

use Regex::PreSuf; 

my $re = presuf(qw(foobar fooxar foozap)); 

# $re should be now 'foo(?:zap|[bx]ar)' 
+0

अच्छा लगता है! मुझे आश्चर्य है कि सी # समुदाय क्या कर सकता है;) –

+0

बहुत बढ़िया! मैं वास्तव में उम्मीद कर रहा हूं कि यह जेएस में भी मौजूद है। – reconbot

3

पर्ल regex संकलक विकल्प भर में आम में कुछ हिस्सों के साथ पैटर्न के बाहर एक शाखाओं में trie डेटा संरचना बनाता है:

$ perl -Mre=debug -ce '"whatever" =~ /appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\.domain\.tld/' 
Compiling REx "appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\."... 
Final program: 
    1: EXACT <appserver> (5) 
    5: TRIEC-EXACT[123] (25) 
     <1.domain.tld> 
     <2.domain.tld> 
     <3.domain.tld> 
    25: END (0) 
anchored "appserver" at 0 (checking anchored) minlen 21 
-e syntax OK 
Freeing REx: "appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\."... 
+0

क्या आप संकलित रेगेक्स को एक स्ट्रिंग के रूप में खींच सकते हैं? – reconbot

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