2008-08-22 10 views
84

パフォーマンステストのためのデータを生成するのに役立つJavaユーティリティを書いています。 実際に涼しい私の発電機がこれに一致するものを吐き出すように文字列のための正規表現を指定できるようになるでしょう。私はこれを行うのに使うことができる何かがすでに焼かれていますか?またはそこに私のほとんどを得るライブラリがありますか?Regexを使って文字列を生成するのではなく、文字列を生成する

おかげ

+0

を正規表現を使ってStringを生成するための多くの機能を提供する便利な[javaライブラリ](https://github.com/mifmif/Generex)があります(ランダム生成、インデックスに基づいた文字列の生成、すべてのStringの生成)。 [こちら](https://github.com/mifmif/Generex) – Mifmif

答えて

30

編集:コメントで述べたように

、これをacheiveするGoogleのコードで入手可能なライブラリがあります: http://code.google.com/p/xeger

参照Mifmif

オリジナルメッセージによって示唆されているようにもhttps://github.com/mifmif/Generex

まず、 hは十分に複雑な正規表現ですが、これは不可能だと私は信じています。しかし、あなたは単純な正規表現のために何かをまとめることができるはずです。

クラスjava.util.regex.Patternのソースコードを見ると、Nodeインスタンスの内部表現が使用されていることがわかります。さまざまなパターンコンポーネントのそれぞれは、独自のNodeサブクラスの実装を持っています。これらのノードはツリーに編成されています。

このツリーを横断するビジターを生成することで、オーバーロードされたジェネレーターメソッドまたは何らかの種類のBuilderを呼び出すことができます。

+4

実際にJavaライブラリがあります:http://code.google.com/p/xeger/ –

+0

私はXegerが良いとは確信していません。文字クラスは扱えません。それは簡単な '[\ w]'を認識できません。 [そのwiki](https://code.google.com/archive/p/xeger/wikis/XegerLimitations.wiki)の最後の行を見ると、それがわかります。 –

1

あなたは文字列の作者のように、独自のパーサーを作成する必要があります::ランダム(Perlは)でした。実際、彼はそのモジュールのどこにでも正規表現を使用しません。それはperl-codersが慣れているものです。

一方、the sourceを見て、いくつかのポインタを得ることができます。


編集:くそ、blairは15秒間パンチに殴られました。

4

Visual Studio Team Systemには次のような内容が含まれています。 Check it out

Javaにはあまり役に立ちませんので、ごめんなさい。 stackoverflowのポッドキャスト11で

3

スポルスキ:うん。新製品もあります。チームシステムを使用したくない場合は、Redgateの友人にSQL Data Generator [http://www.red-gate.com/products/sql_data_generator/index.htm]]という製品があります。それは295ドルで、現実的なテストデータを生成するだけです。そして実際に実際に存在する都市の柱の中に実際の都市を生成するようなことを行い、それを生成すると状態を間違ったり、ドイツの都市に移したりするのではなく、正しい状態になるでしょう...ご存じのように、それはかなり現実的な見た目のデータを生成します。私は本当にすべての機能が何であるかは分かりません。

これはおそらくあなたが探しているものではありませんが、自分で作成するのではなく、良い出発点になるかもしれません。

私はgoogleで何かを見つけることができないので、与えられた正規表現を最小単位の作業(\ w、[xx]、\ dなど)に分解して問題を解決することをお勧めしますそれらの正規表現フレーズをサポートするための基本的な方法。

したがって、任意の文字を返すgetRandomLetter()メソッドと、2つの値の間にランダムな文字を与えるgetRandomLetter(char startLetter、char endLetter)メソッドがあります。

2

私は受け入れ答えが既にありますけど、私はレッドゲートのデータジェネレータ(クレイグの答えで述べたもの)を使用してきた、それは私がそれを投げてきたすべてのために本当によく働きます。それは速いですし、私は同じ正規表現を使用して、このことが吐き出す登録コードのようなものについて実際のデータを生成したいと思っています。

それはのような正規表現をとります

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

、それはのようなユニークなコードのトン生成します。これはレッドゲートを考え出したと我々はすべての出ているいくつかの大きな秘密アルゴリズムです

LLK-32U 

を私たちが単なる死者が実際にできることは何ですか?

0

完全なPCRE正規表現をサポートするのは遠いですが、以下のRubyメソッドを使って正規表現のような文字列を取得し、バリエーションを作成しました。 (言語ベースのCAPTCHAのために。)

# 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
4

私は(C#でなく、Java開発者のために理解しやすいはずです)そのために私ownライブラリを転がりのルートを行ってきました。

Rxrdgは、実生活プロジェクトのテストデータを作成する問題の解決策として開始されました。基本的な考え方は、既存の(正規表現)検証パターンを活用して、そのようなパターンに適合するランダムなデータを作成することです。このようにして、有効なランダムデータが作成されます。

単純な正規表現パターンのパーサーを書くのはそれほど難しいことではありません。文字列を生成するために抽象構文木を使用する方がさらに簡単になります。

+0

リンクはもはやリポジトリを指していません。私はhttps://www.openhub.net/p/rxrdgに行きます。しかし、ソリューションは構築されませんか? – Veverke

18

Xeger (Java)は同様にそれを行うことが可能です:

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

Xegerはうまく動作します。しかし、クラスパスまたはあなたのpom/gradleに[automaton jar](https://mvnrepository.com/artifact/dk.brics.automaton/automaton/1.11-8)があることを確認してください。 –

1

私はフライトで午前だけ質問を見た:私が最も簡単ですが非効率と不完全なソリューションを書かれています。

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); 
} 
+0

どのような文字列がパターン入力として使用されますか。まず、ソースコードからそのようなことを判断するのは簡単ではありません。第二に、ソースコードに間違いや不明瞭さがある場合、それらが意図的であるかどうかを見る方法がありません。 –

+0

StringTokenizerは、互換性のために保持される従来のクラスですが、新しいコードでの使用は推奨されません。この機能を求めている人は、Stringのsplitメソッドまたはjava.util.regexパッケージを代わりに使用することをお勧めします。 – Rohit

10

オリジナルのポスターを手助けするのは遅すぎますが、それは新人を助けることができます。 Generexは、文字列を生成するために正規表現を使用するための多くの機能(ランダム生成、そのインデックスに基づいた文字列の生成、すべての文字列の生成...)を提供する便利なJavaライブラリです。あなたの正規表現

をカバーする "悪" の文字列を生成し

EGRET http://elarson.pythonanywhere.com/

例:

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 
+5

Generexは自分のプロジェクトですね。このルールは[こちら](http://stackoverflow.com/help/behavior)に従って、あなた自身のプロジェクトであることをあなたの投稿で言及してもよろしいですか? –

-1

あなたが "クリティカル" の文字列を生成したい場合は、検討する必要がありますMUTREX http://cs.unibg.it/mutrex/ 正規表現によるエラー検出文字列を生成する

どちらも学術的ツールです(私は後者の著者の一人です)、合理的にうまく動作します。

-1

この質問は非常に古いですが、私は自分の検索でそれを見つけたので、他の言語で同じ機能を探している他の人のためのリンクをいくつか含めることにします。