2009-10-16 12 views
26

हाँ, आप इसे सही पढ़ते हैं। मुझे कुछ ऐसी चीज चाहिए जो नियमित अभिव्यक्ति से यादृच्छिक पाठ उत्पन्न करने में सक्षम है। तो पाठ यादृच्छिक होना चाहिए, लेकिन नियमित अभिव्यक्ति से मिलान किया जाना चाहिए। ऐसा लगता है कि यह अस्तित्व में नहीं है, लेकिन मैं गलत हो सकता है।मैं नियमित अभिव्यक्ति से नियमित अभिव्यक्ति से मिलान करने वाला पाठ कैसे उत्पन्न करूं?

बस एक एक उदाहरण: कि पुस्तकालय '[ab]*c' इनपुट के रूप में उठाने में सक्षम होगा, और इस तरह के रूप नमूने उत्पन्न:

एबीसी
abbbc
बक

आदि

अद्यतन: Xeger: मैं कुछ अपने आप बनाया। http://code.google.com/p/xeger/ देखें।

+1

कूल विचार - परिणाम सुनने में रुचि रखते हैं। – Ryall

+0

यह वास्तव में काफी उपयोगी होगा! – p3t0r

+0

मुझे लगता है कि किसी भी "... या अधिक" चयनकर्ताओं को सीमित होना होगा या आप 1,000,000 वर्ण शब्दों के साथ समाप्त हो सकते हैं: एस – Ryall

उत्तर

16

मैं सिर्फ एक मिनट पहले ऐसा करने के लिए एक पुस्तकालय बनाया। यह यहां होस्ट किया गया है: http://code.google.com/p/xeger/। इसका उपयोग करने से पहले निर्देशों को ध्यान से पढ़ें।

String regex = "[ab]{4,6}c"; 
Xeger generator = new Xeger(regex); 
String result = generator.generate(); 
assert result.matches(regex); 
7

मैं इस तरह के एक पुस्तकालय के बारे में पता नहीं कर रहा हूँ। आप अपने आप को एक लेखन में रुचि रखते हैं, तो इन शायद रहे हैं कदम उठाने की आवश्यकता होगी:

  1. नियमित अभिव्यक्ति के लिए एक पार्सर (आप regexes की एक सीमित वर्ग के साथ शुरू करना चाहते हो सकता है) लिखें ।

  2. एक NFA का निर्माण करने के परिणाम का उपयोग करें।

  3. (वैकल्पिक) एक DFA को NFA बदलें।

  4. बेतरतीब ढंग से, किसी भी स्वीकार कर राज्य के लिए शुरू राज्य से उत्पन्न automaton पार करते हुए पात्रों हर संक्रमण द्वारा outputted भंडारण।

परिणाम एक शब्द है जो मूल regex द्वारा स्वीकार किया जाता है। अधिक के लिए, उदा। देखें Converting a Regular Expression into a Deterministic Finite Automaton

+0

मैं एक पुस्तकालय की तलाश में हूं जो जावा में रेगेक्स से एनएफए बनाएगा। मुझे पता है कि उपर्युक्त काम करेगा, क्योंकि मैं इसे पहले जावास्क्रिप्ट में करता था। –

+0

मुझे लगता है कि यह देखने के लायक होगा: http://www.brics.dk/~amoeller/automaton/ –

+0

मैंने ऊपर वर्णित लाइब्रेरी के आधार पर ज़ीगर लागू किया। –

2

Here'sa fewimplementations ऐसे जानवर के, लेकिन उनमें से कोई भी जावा में नहीं है (और बंद स्रोत स्रोत माइक्रोसॉफ्ट के सभी को उनके regexp सुविधा समर्थन में बहुत सीमित है)।

0

यहाँ ऐसे ही एक मॉड्यूल की एक अजगर दिया गया है:: http://www.mail-archive.com/[email protected]/msg125198.html यह पोर्टेबल होना चाहिए (। विशेष रूप से एक-दूसरे के लिए आवश्यक पुस्तकालय को डाउनलोड करने के संदर्भ में) ;-)

इस तरह आप इसका इस्तेमाल है जावा में

2

विल्फ्रेड स्प्रिंगर के समाधान के आधार पर http://www.brics.dk/~amoeller/automaton/ के साथ मैं एक और जनरेटर बनाता हूं। यह रिकर्सन का उपयोग नहीं करता है। यह इनपुट/पटर/नियमित एक्सप्रेशन न्यूनतम स्ट्रिंग लंबाई और अधिकतम स्ट्रिंग लंबाई इनपुट के रूप में लेते हैं। परिणाम न्यूनतम और अधिकतम लंबाई के बीच एक स्वीकृत स्ट्रिंग है। यह कुछ एक्सएमएल "शॉर्ट हैंड कैरेक्टर क्लासेस" को भी अनुमति देता है। मैं इसे एक्सएमएल नमूना जेनरेटर के लिए उपयोग करता हूं जो पहलुओं के लिए वैध स्ट्रिंग बनाता है।

public static final String generate(final String pattern, final int minLength, final int maxLength) { 
    final String regex = pattern 
      .replace("\\d", "[0-9]")  // Used d=Digit 
      .replace("\\w", "[A-Za-z0-9_]") // Used d=Word 
      .replace("\\s", "[ \t\r\n]"); // Used s="White"Space 
    final Automaton automaton = new RegExp(regex).toAutomaton(); 
    final Random random = new Random(System.nanoTime()); 
    final List<String> validLength = new LinkedList<>(); 
    int len = 0; 
    final StringBuilder builder = new StringBuilder(); 
    State state = automaton.getInitialState(); 
    Transition[] transitions; 
    while(len <= maxLength && (transitions = state.getSortedTransitionArray(true)).length != 0) { 
     final int option = random.nextInt(transitions.length); 
     if (state.isAccept() && len >= minLength && len <= maxLength) validLength.add(builder.toString()); 
     final Transition t = transitions[option]; // random transition 
     builder.append((char) (t.getMin()+random.nextInt(t.getMax()-t.getMin()+1))); len ++; 
     state = t.getDest(); 
    } 
    if(validLength.size() == 0) throw new IllegalArgumentException(automaton.toString()+" , "+minLength+" , "+maxLength); 
    return validLength.get(random.nextInt(validLength.size())); 
} 
संबंधित मुद्दे