স্ট্রিংগুলি মিলে না যায় তার চেয়ে উত্পন্ন করার জন্য রেজেক্স ব্যবহার করে


108

আমি একটি জাভা ইউটিলিটি লিখছি যা আমাকে পারফরম্যান্স পরীক্ষার জন্য প্রচুর ডেটা তৈরি করতে সহায়তা করে। এটি হবে সত্যিই স্ট্রিংস জন্য Regex উল্লেখ পাবে ঠান্ডা তাই আমার জেনারেটরের যা এই ম্যাচ খুঁজে spits যে। ইতিমধ্যে বেকডের বাইরে এমন কিছু আছে যা আমি এটি করতে ব্যবহার করতে পারি? বা এমন কোনও লাইব্রেরি আছে যা আমাকে বেশিরভাগ পথে পায়?

ধন্যবাদ


1
এখানে একটি দরকারী জাভা লাইব্রেরি যে Regex ব্যবহার STRING (র্যান্ডম প্রজন্ম, এটা সূচির উপর ভিত্তি করে স্ট্রিং জেনারেট করেন, সব স্ট্রিং উৎপন্ন ..) এটি চেক আউট উৎপন্ন করার জন্য অনেক বৈশিষ্ট্য প্রদান এখানে
Mifmif

আরেকটি বিকল্প হতে পারে এই
Vladislav Varslavans

উত্তর:


40

সম্পাদনা: মন্তব্যে উল্লিখিত হিসাবে, এটি অর্জনের জন্য গুগল কোডে একটি লাইব্রেরি রয়েছে: https://code.google.com/archive/p/xeger/

মিফমিফের পরামর্শ অনুসারে https://github.com/mifmif/Generex এছাড়াও দেখুন

আসল বার্তা:

প্রথমত, একটি জটিল পর্যাপ্ত রিজেক্সের সাহায্যে আমি বিশ্বাস করি এটি অসম্ভব হতে পারে। তবে আপনার সরল রেজিেক্সপসের জন্য কিছু একসাথে রাখতে সক্ষম হওয়া উচিত।

আপনি java.util.regex.Pattern শ্রেণীর উত্স কোডটি একবার দেখে নিলে দেখতে পাবেন যে এটি নোডের উদাহরণগুলির অভ্যন্তরীণ উপস্থাপনা ব্যবহার করে। বিভিন্ন ধরণের উপাদানগুলির প্রতিটি নোড সাবক্লাসের নিজস্ব প্রয়োগ রয়েছে। এই নোডগুলি একটি গাছে সাজানো হয়েছে।

এই গাছটিকে অতিক্রম করে এমন কোনও দর্শকের উত্পাদন করে, আপনার একটি ওভারলোডেড জেনারেটর পদ্ধতি বা এমন কোনও বিল্ডার কল করতে সক্ষম হওয়া উচিত যা কিছু একসাথে কোবিল করে।


2
আমি নিশ্চিত না যে জেগারের পক্ষে ভাল। এটি অক্ষর শ্রেণি পরিচালনা করতে পারে না। এটি একটি সাধারণ চিনতে ব্যর্থ [\w]তাদের উইকের শেষ লাইনটি দেখে আমাদের তা জানায়।
জন রেড

2
এগুলিও নোট করুন যে এটির উপর নির্ভর করে dk.brics.automaton3 য় পক্ষের পম নির্ভরতা যুক্ত করতে প্রস্তুত। বেশিরভাগ লোকেরা এতে আপত্তি করে না তবে আমার ইচ্ছা কিছুটা আরও কমপ্যাক্ট ছিল was
শ্রীধর সারনোবাত

জেগার এবং জেনেরেক্সের বিকল্প রয়েছে। এটিতে এই সমস্ত ত্রুটি রয়েছে এবং এটি অচল নয়। আমার উত্তর নিচে স্ক্রোল করুন।
ভ্লাদিস্লাভ ভার্স্লাভানস

"প্রথমত, একটি জটিল পর্যাপ্ত রিজেক্সের সাথে, আমি বিশ্বাস করি এটি অসম্ভব হতে পারে" " - এই হল কঠোরভাবে সত্য নয় : কোনো Regex বিরুদ্ধে পাসের কিছু একটি বৈধ ইনপুট তৈরি করতে পারেন। ব্যাখ্যা: রেজেক্সসগুলি চমস্কি হায়ারার্কিতে টাইপ -3 হয়, যার অর্থ এফএসএম হিসাবে প্রকাশ করা যেতে পারে। কোনও এফএসএম পদক্ষেপ নেওয়ার সময়, প্রতিটি প্রান্তটি পরবর্তী অক্ষরের জন্য একটি নিয়ম হিসাবে ব্যাখ্যা করা হয়, সুতরাং একটি এফএসএম ব্যবহার করে ক্রমগুলি পার্স করতে বা তৈরি করতে পারে । যদি কোনও এফএসএমের টার্মিনালে যাওয়ার পথ থাকে, তবে একটি বৈধ ক্রম নির্ধারণ করা যায়। সুতরাং, এটি কেবলমাত্র "অসম্ভব" যদি টার্মিনালের কোনও পথ না থাকে (যা একটি অকেজো রিজেক্স হবে)।
লরেন্স ওয়েজারফিল্ড

22

মূল পোস্টারটি সাহায্য করতে খুব দেরী হয়েছে, তবে এটি কোনও নতুনকে সহায়তা করতে পারে। জেনেরেক্স হ'ল একটি দরকারী জাভা গ্রন্থাগার যা স্ট্রিং তৈরি করতে রেগেক্সগুলি ব্যবহার করার জন্য অনেকগুলি বৈশিষ্ট্য সরবরাহ করে (এলোমেলো প্রজন্ম, তার সূচির উপর ভিত্তি করে একটি স্ট্রিং উত্পন্ন করে, সমস্ত স্ট্রিং উত্পন্ন করে ...)।

উদাহরণ:

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

// generate the second String in lexicographical order that matches 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 prints 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

প্রকাশ

এই পোস্টে উল্লিখিত প্রকল্পটি ব্যবহারকারী (মিফমিফ) প্রশ্নের উত্তর দিচ্ছেন। অনুযায়ী নিয়ম , এই প্রয়োজন প্রতিপালিত হবে।


11
দেখে মনে হচ্ছে জেনারেক্স আপনার নিজস্ব প্রকল্প। আপনি কি আপনার পোস্টে উল্লেখ করতে আপত্তি করবেন যে এখানে নিয়ম অনুসারে এটি আপনার নিজের প্রকল্প ?
ব্রায়ান ম্যাকচ্যাচন

20

জেগার (জাভা) এটি করতে সক্ষম:

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

1
জেগার সুন্দরভাবে কাজ করে। কিন্তু নিশ্চিত আপনার আছে যে যন্ত্রমানব বয়াম বর্গ পথে অথবা আপনার পম / gradle মধ্যে
Delicia Brummitt

5

আমি আমার নিজের রোলিংয়ের মূলকে গেছি জন্য লাইব্রেরি (সি # তে তবে জাভা বিকাশকারীদের পক্ষে বোঝা সহজ হওয়া উচিত)।

আরএক্সআরডিজি বাস্তব জীবনের প্রকল্পের জন্য পরীক্ষার ডেটা তৈরির সমস্যার সমাধান হিসাবে শুরু হয়েছিল। মূল ধারণাটি হ'ল এ জাতীয় নিদর্শনগুলির সাথে সঙ্গতিপূর্ণ এলোমেলো ডেটা তৈরি করতে বিদ্যমান (নিয়মিত প্রকাশ) বৈধতা নিদর্শনগুলির উত্তোলন করা। এইভাবে বৈধ র্যান্ডম ডেটা তৈরি করা হয়।

সরল রেজেক্স নিদর্শনগুলির জন্য পার্সার লেখা এত কঠিন নয়। স্ট্রিং উত্পন্ন করতে একটি বিমূর্ত সিনট্যাক্স ট্রি ব্যবহার করা আরও সহজ হওয়া উচিত।


লিঙ্কটি আর সংগ্রহস্থলের দিকে নির্দেশ করে না। আমি openhub.net/p/rxrdg নিয়ে যাব । সমাধানটি তৈরি হয় না, তবে?
ভেভারকে

4

স্ট্যাকওভারফ্লো পডকাস্ট 11 এ:

স্পলস্কি: হ্যাঁ একটি নতুন পণ্যও রয়েছে, যদি আপনি সেখানে টিম সিস্টেমটি ব্যবহার করতে না চান তবে রেডগেটে আমাদের বন্ধুদের এসকিউএল ডেটা জেনারেটর নামে একটি পণ্য রয়েছে [ http://www.red-gate.com/products/sql_data_generator/index.htm] । এটি 295 ডলার এবং এটি কেবল কিছু বাস্তবসম্মত পরীক্ষার ডেটা তৈরি করে। এবং এটি শহর কলামে প্রকৃত শহরগুলি তৈরি করার মতো জিনিসগুলি করে যা বাস্তবে বিদ্যমান, এবং তারপরে যখন এটি তৈরি করে তখন রাষ্ট্রটি অধিকার পাবে, রাষ্ট্রকে ভুল হওয়ার পরিবর্তে, বা জার্মান শহরগুলিতে এবং রাষ্ট্রগুলিতে রাখার মতো ... আপনি জানেন, এটি চমত্কার বাস্তব প্রত্যাশিত ডেটা উত্পন্ন করে। সমস্ত বৈশিষ্ট্য কী তা আমি সত্যিই নিশ্চিত নই।

এটি সম্ভবত আপনি যা খুঁজছেন তা নয়, তবে এটি নিজের তৈরি করার পরিবর্তে ভাল সূচনা পয়েন্ট হতে পারে।

আমি গুগলে কোনও কিছুই খুঁজে পাচ্ছি না বলে আমি কোনও নির্দিষ্ট নিয়মিত কাজের ছোট ছোট ইউনিটগুলিতে (\ ডাব্লু, [এক্সএক্স], \ ডি, ইত্যাদি) ভাগ করে এবং সমর্থন করার জন্য কিছু বেসিক পদ্ধতি লিখে সমস্যাটি সমাধান করার পরামর্শ দেব would এই নিয়মিত অভিব্যক্তি বাক্যাংশ।

সুতরাং \ w এর জন্য আপনার কাছে একটি পদ্ধতি getRandomLetter () থাকবে যা কোনও র্যান্ডম লেটার দেয়, এবং আপনার সাথে getRandomLetter (Char startLetter, Char endLetter) পাওয়া যায় যা আপনাকে দুটি মানের মধ্যে একটি এলোমেলো চিঠি দেয়।


4

এই সমস্যাটি আমার পক্ষে সত্যই যদিও পুরানো। আমি এক্সার এবং জেনেরেক্স চেষ্টা করেছি এবং তারা আমার নিয়মগুলি পূরণ করেছে বলে মনে হয় না। তারা প্রকৃতপক্ষে কিছু রেজেক্স নিদর্শনগুলি (যেমন a{60000}) বা অন্যদের (যেমন (A|B|C|D|E|F)) প্রসেস করতে ব্যর্থ হয় তারা কেবল সমস্ত সম্ভাব্য মান উত্পাদন করে না। যেহেতু আমি অন্য কোনও উপযুক্ত সমাধান খুঁজে পাইনি - আমি নিজের লাইব্রেরি তৈরি করেছি।

https://github.com/curious-odd-man/RgxGen

মাভেন সেন্ট্রাল উপলভ্যে কারুকার্যও রয়েছে।

ব্যবহারের উদাহরণ:

RgxGen rgxGen = new RgxGen(aRegex);                     // Create generator
String s = rgxGen.generate();                           // Generate new random value

3

আমি জানি ইতিমধ্যে একটি স্বীকৃত উত্তর রয়েছে, তবে আমি রেডগেটের ডেটা জেনারেটর (ক্রেগের উত্তরে উল্লিখিত এক) ব্যবহার করেছি এবং আমি যা কিছু ফেলেছি তার জন্য এটি সত্যিই ভাল কাজ করে। এটি দ্রুত এবং এটি আমাকে রেজিস্ট্রেশন কোডের মতো জিনিসগুলির জন্য আসল ডেটা উত্পন্ন করতে একই রেজেক্স ব্যবহার করতে চায় যা এই জিনিসটি ছড়িয়ে যায়।

এটি একটি রিজেেক্স লাগে:

[A-Z0-9]{3,3}-[A-Z0-9]{3,3}

এবং এটি প্রচুর অনন্য কোড উত্পন্ন করে:

LLK-32U

এটি কি কিছু বড় গোপন আলগোরিদম যা রেডগেট আবিষ্কার করেছিল এবং আমরা সকলেই ভাগ্যের বাইরে আছি বা এটি এমন কিছু যা আমাদের নিছক নশ্বরেরা আসলেই করতে পারে?


3

আমি ফ্লাইটে আছি এবং সবেমাত্র প্রশ্নটি দেখেছি: আমি সবচেয়ে সহজ তবে অদক্ষ ও অসম্পূর্ণ সমাধানটি লিখেছি। আমি আশা করি এটি আপনাকে নিজের পার্সার লেখা শুরু করতে সহায়তা করতে পারে:

public static void main(String[] args) {

    String line = "[A-Z0-9]{16}";
    String[] tokens = line.split(line);
    char[] pattern = new char[100];
    int i = 0;
    int len = tokens.length;
    String sep1 = "[{";
    StringTokenizer st = new StringTokenizer(line, sep1);

    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        System.out.println(token);

        if (token.contains("]")) {
            char[] endStr = null;

            if (!token.endsWith("]")) {
                String[] subTokens = token.split("]");
                token = subTokens[0];

                if (!subTokens[1].equalsIgnoreCase("*")) {
                    endStr = subTokens[1].toCharArray();
                }
            }

            if (token.startsWith("^")) {
                String subStr = token.substring(1, token.length() - 1);
                char[] subChar = subStr.toCharArray();
                Set set = new HashSet<Character>();

                for (int p = 0; p < subChar.length; p++) {
                    set.add(subChar[p]);
                }

                int asci = 1;

                while (true) {
                    char newChar = (char) (subChar[0] + (asci++));

                    if (!set.contains(newChar)) {
                        pattern[i++] = newChar;
                        break;
                    }
                }
                if (endStr != null) {
                    for (int r = 0; r < endStr.length; r++) {
                        pattern[i++] = endStr[r];
                    }
                }

            } else {
                pattern[i++] = token.charAt(0);
            }
        } else if (token.contains("}")) {
            char[] endStr = null;

            if (!token.endsWith("}")) {
                String[] subTokens = token.split("}");
                token = subTokens[0];

                if (!subTokens[1].equalsIgnoreCase("*")) {
                    endStr = subTokens[1].toCharArray();
                }
            }

            int length = Integer.parseInt((new StringTokenizer(token, (",}"))).nextToken());
            char element = pattern[i - 1];

            for (int j = 0; j < length - 1; j++) {
                pattern[i++] = element;
            }

            if (endStr != null) {
                for (int r = 0; r < endStr.length; r++) {
                    pattern[i++] = endStr[r];
                }
            }
        } else {
            char[] temp = token.toCharArray();

            for (int q = 0; q < temp.length; q++) {
                pattern[i++] = temp[q];
            }
        }
    }

    String result = "";

    for (int j = 0; j < i; j++) {
        result += pattern[j];
    }

    System.out.print(result);
}

প্যাটার্ন ইনপুট হিসাবে কোন ধরণের স্ট্রিং ব্যবহৃত হয় তা আপনি নির্দেশ করতে চাইতে পারেন। প্রথমত, উত্স কোড থেকে এই জাতীয় জিনিসগুলি নির্ধারণ করা এত সহজ নয়। দ্বিতীয়ত, সোর্স কোডে যদি কোনও ভুল বা অস্বস্তি হয় তবে সেগুলি ইচ্ছাকৃত কিনা তা দেখার কোনও উপায় নেই।
মার্টেন বোদেউয়েস

স্ট্রিংটোকেনাইজার হ'ল একটি উত্তরাধিকার শ্রেণি যা সামঞ্জস্যতার কারণে ধরে রাখা হয় যদিও এর ব্যবহারটি নতুন কোডে নিরুৎসাহিত করা হয়েছে। সুপারিশ করা হয় যে এই কার্যকারিতাটি খুঁজছেন তার পরিবর্তে স্ট্রিংয়ের বিভাজন পদ্ধতি বা java.util.regex প্যাকেজটি ব্যবহার করুন।
রোহিত

2

আপনার নিজের পার্সার লিখতে হবে, যেমন স্ট্রিংয়ের লেখক :: র্যান্ডম (পার্ল) করেছেন। বাস্তবে, তিনি সেই মডিউলটিতে কোথাও রেজিজেস ব্যবহার করেন না, পার্ল-কোডারদের ব্যবহার কেবল এটিই।

অন্যদিকে, সম্ভবত আপনি কিছু পয়েন্টার পেতে উত্সটি একবারে দেখতে পারেন ।


সম্পাদনা: জঘন্য, ব্লেয়ার 15 সেকেন্ডের মধ্যে আমাকে ঘুষি মারল।


1

এটি একটি সম্পূর্ণ পিসিআরই রিজেপএক্স সমর্থন করা থেকে দূরে, তবে আমি একটি রেজিএক্সপ্যাকের মতো স্ট্রিং নিতে এবং এতে ভিন্নতা আনতে নিম্নলিখিত রুবি পদ্ধতিটি লিখেছিলাম। (ভাষাভিত্তিক ক্যাপচা জন্য।)

# q = "(How (much|many)|What) is (the (value|result) of)? :num1 :op :num2?"
# values = { :num1=>42, :op=>"plus", :num2=>17 }
# 4.times{ puts q.variation( values ) }
# => What is 42 plus 17?
# => How many is the result of 42 plus 17?
# => What is the result of 42 plus 17?
# => How much is the value of 42 plus 17?
class String
  def variation( values={} )
    out = self.dup
    while out.gsub!( /\(([^())?]+)\)(\?)?/ ){
      ( $2 && ( rand > 0.5 ) ) ? '' : $1.split( '|' ).random
    }; end
    out.gsub!( /:(#{values.keys.join('|')})\b/ ){ values[$1.intern] }
    out.gsub!( /\s{2,}/, ' ' )
    out
  end
end

class Array
  def random
    self[ rand( self.length ) ]
  end
end

1

এই প্রশ্নটি খুব পুরানো, তবে আমি নিজের অনুসন্ধানে এটিকে হোঁচট খেয়েছি, তাই আমি অন্যদের জন্য দু'টি লিঙ্ক অন্তর্ভুক্ত করব যারা অন্যান্য ভাষায় একই কার্যকারিতাটি অনুসন্ধান করতে পারে।


0

আপনি যদি "সমালোচনামূলক" স্ট্রিং উত্পন্ন করতে চান তবে আপনি বিবেচনা করতে পারেন:

EGRET http://elaron.pythonanywhere.com/ যা আপনার নিয়মিত প্রকাশকে আবৃত করে "দুষ্ট" স্ট্রিং উত্পন্ন করে

মিউট্রেএক্স http://cs.unibg.it/mutrex/ যা রেজেক্স রূপান্তর দ্বারা ত্রুটি সনাক্তকরণ স্ট্রিং উত্পন্ন করে

উভয়ই একাডেমিক সরঞ্জাম (আমি পরবর্তীকালের অন্যতম লেখক) এবং যুক্তিসঙ্গতভাবে ভালভাবে কাজ করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.