2008-11-07 35 views
26

Tôi muốn biết nếu có phần mềm, được đưa ra một regex và tất nhiên một số ràng buộc khác như độ dài, tạo văn bản ngẫu nhiên luôn khớp với regex đã cho. Cảm ơnTrình tạo văn bản ngẫu nhiên dựa trên regex

+0

Câu hỏi trùng lặp: http://stackoverflow.com/questions/22115/using-regex-to-generate-strings-rather-than- match-them –

Trả lời

20

Xeger có khả năng làm việc đó:

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

Aha ... tên tuyệt vời !! – gui11aume

+3

Tùy thuộc vào biểu thức chính quy được sử dụng, tính ngẫu nhiên sẽ bị lệch. Ví dụ: regex '[a-yZ]' sẽ tạo ra số lần 'Z' cao gấp 26 lần so với các chữ cái khác. Xem http://code.google.com/p/xeger/wiki/XegerLimitations – Twilite

0

Thay vì bắt đầu từ regexp, bạn nên xem xét việc viết ngữ cảnh nhỏ miễn phí, điều này sẽ cho phép bạn dễ dàng tạo văn bản ngẫu nhiên như vậy. Thật không may, tôi biết không có công cụ mà sẽ làm điều đó trực tiếp cho bạn, vì vậy bạn sẽ cần phải làm một chút mã của mình để thực sự tạo ra các văn bản. Nếu bạn chưa từng làm việc với các trình xử lý ngữ pháp trước đây, tôi khuyên bạn nên đọc một chút về định dạng bnf và "trình biên dịch trình biên dịch" trước khi tiến hành ...

1

Tôi không biết bất kỳ điều gì, mặc dù có thể. Cách tiếp cận thông thường là viết một ngữ pháp thay vì một biểu thức chính quy, và sau đó tạo ra các chức năng cho mỗi thiết bị đầu cuối không ngẫu nhiên quyết định sản xuất nào sẽ mở rộng. Nếu bạn có thể đăng mô tả về các loại chuỗi mà bạn muốn tạo và ngôn ngữ bạn đang sử dụng, chúng tôi có thể giúp bạn bắt đầu.

1

Chúng tôi đã làm điều gì đó tương tự bằng Python không quá lâu trước đây cho một RegEx game mà chúng tôi đã viết. Chúng tôi đã có ràng buộc rằng regex phải được tạo ngẫu nhiên và những từ được chọn phải là những từ thực sự. Bạn có thể tải xuống trò chơi hoàn chỉnh EXE here và mã nguồn Python here.

Dưới đây là một đoạn trích:

def generate_problem(level): 
    keep_trying = True 
    while(keep_trying): 
    regex = gen_regex(level) 
    # print 'regex = ' + regex 
    counter = 0 
    match = 0 
    notmatch = 0 
    goodwords = [] 
    badwords = [] 
    num_words = 2 + level * 3 
    if num_words > 18: 
     num_words = 18 
    max_word_length = level + 4 
    while (counter < 10000) and ((match < num_words) or (notmatch < num_words)): 
     counter += 1 
     rand_word = words[random.randint(0,max_word)] 
     if len(rand_word) > max_word_length: 
     continue 
     mo = re.search(regex, rand_word) 
     if mo: 
     match += 1 
     if len(goodwords) < num_words: 
      goodwords.append(rand_word) 
     else: 
     notmatch += 1 
     if len(badwords) < num_words: 
      badwords.append(rand_word) 
    if counter < 10000: 
     new_prob = problem.problem() 
     new_prob.title = 'Level ' + str(level) 
     new_prob.explanation = 'This is a level %d puzzle. ' % level 
     new_prob.goodwords = goodwords 
     new_prob.badwords = badwords 
     new_prob.regex = regex 
     keep_trying = False 
     return new_prob 
8

Kiểm tra các RandExp gói Ruby. Nó làm những gì bạn muốn, mặc dù chỉ trong một thời trang hạn chế. (Nó sẽ không hoạt động với mọi regexp có thể, chỉ có các regexps đáp ứng một số hạn chế.)

+1

Nó được di chuyển: http://github.com/benburkert/randexp –

12

Tất cả các biểu thức chính quy có thể được diễn tả như ngữ pháp tự do ngữ cảnh. Và có a nice algorithm already worked out để tạo các câu ngẫu nhiên, từ bất kỳ CFG nào, có độ dài nhất định. Vì vậy, upconvert regex để một cfg, áp dụng các thuật toán, và wham, bạn đang thực hiện.

+0

Bất kỳ triển khai nào được biết đến của bản ngã? Đây có phải là một cảnh quay dài không? – Paralife

+0

Tôi đã triển khai thành công nó trong Perl năm trước, và nó thấy việc sử dụng 'sản xuất', vì vậy tôi có thể đã làm đúng. Phần khó nhất của quá trình này là hiểu được ký hiệu được sử dụng trong bài báo. Rõ ràng rằng rào cản và bạn vàng. –

+1

Nếu tôi tìm ra nơi Perl là, tôi sẽ ho nó lên, nhưng không đếm trên bất cứ điều gì. –

7

Nếu bạn muốn có một giải pháp Javascript, thử randexp.js.

1

Quá trễ nhưng nó có thể giúp người mới, đây là một hữu ích java library cung cấp nhiều tính năng cho việc sử dụng regex để tạo String (thế hệ ngẫu nhiên, tạo ra chuỗi dựa trên chỉ số của nó, tạo ra tất cả chuỗi ..) check it out here.

Ví dụ:

Generex generex = new Generex("[0-3]([a-c]|[e-g]{1,2})"); 

    // generate the second String in lexicographical order that match the given Regex. 
    String secondString = generex.getMatchedString(2); 
    System.out.println(secondString);// it print '0b' 

    // Generate all String that matches the given Regex. 
    List<String> matchedStrs = generex.getAllMatchedStrings(); 

    // Using Generex iterator 
    Iterator iterator = generex.iterator(); 
    while (iterator.hasNext()) { 
     System.out.print(iterator.next() + " "); 
    } 
    // it print 0a 0b 0c 0e 0ee 0e 0e 0f 0fe 0f 0f 0g 0ge 0g 0g 1a 1b 1c 1e 
    // 1ee 1e 1e 1f 1fe 1f 1f 1g 1ge 1g 1g 2a 2b 2c 2e 2ee 2e 2e 2f 2fe 2f 2f 2g 
    // 2ge 2g 2g 3a 3b 3c 3e 3ee 3e 3e 3f 3fe 3f 3f 3g 3ge 3g 3g 1ee 

    // Generate random String 
    String randomStr = generex.random(); 
    System.out.println(randomStr);// a random value from the previous String list 
5

Có, có tồn tại phần mềm có thể tạo ra một trận đấu ngẫu nhiên đến một regex:

Các vấn đề liên quan