2

PHP で記述された Javascript と JQuery を組み込んだ Web アプリケーションがあり、これを会社の在庫管理システム (IMS) として使用します。私が作成できるようにしたいのは、値のユーザー入力に基づく正規表現です。

この背後にある考え方は、ほとんどのメーカーのシリアル番号のスキーマ、文字の長さ、および数値とアルファベットの組み合わせが特定の部品に固有であるということです。そのため、部品が IMS に追加され、最初のシリアル番号がシステムにスキャンされると、Regex ステートメントが作成され、その部品タイプに対応するデータベース テーブルに保存されます。今後、シリアル番号がスキャンされると、部品はその製造元のシリアル番号スキーマと一致するため、部品タイプとして自動選択されます。この方法論が常に 1 つのパーツに当てはまるとは限らないことを理解しています。そのため、ユーザーがカタログで検索する代わりに、スキーマに一致するパーツのリストを返すことさえできます。

私の質問の基礎は、正規表現を作成するためにユーザーが指定した値をコード内の関数で解読できるようにすることを検討するための最良の出発点は何ですか? 私は完全な機能を要求しているわけではありませんが、どこから始めればよいかを理解できるように、自分の状況と目標をどのように見るかの出発点です. 私は十分に頭を悩ませ、災害に向かっていることを知ってブロック全体を削除するためだけに、関数を何度も書き始めました。

コードで何でも可能です-これは実現可能ですか?


編集 - 追加されたサンプル値

DVD-RW (光学ドライブ)

  • 1613518L121
  • 1613509L121
  • 1613519L121

VGA 出力カード

  • 0324311071068
  • 0324311071134

COM 拡張カード

  • 608131234
  • 608131237

ハードドライブ

  • WMAYUJ753738
  • WMAYUJ072099
  • WMAYUJ683739
  • WMAYUJ844900

ご覧のとおり、一部の値は特定の長さの文字のみの数値になります。先頭に英字があり、その後に一連の数字が続くものもあります。他のものには、英数字が混在している場合があります。ほとんどの場合、単純な長さの英数字ルールが、商品リスト内の単一の部品タイプを識別するのに適しています。ただし、1 つの値に複数の式が一致する場合は、単純に正規表現に一致する 2 つ以上の製品のリストをアプリケーションに表示させ、ユーザーに適切な部分を選択するように促すことができます。これにより、全体として、WMS データベースで製品タイプを選択する際の時間とミスを節約できます。

コメントありがとうございます。答えが 1 つしかない質問をしているわけではないことは理解しています。文字列を最適にステップ実行し、値に一致する対応する正規表現ステートメントを吐き出す方法の開始点を探しています。

4

3 に答える 3

2

@Pete が言うように、野心的な目標を設定しすぎたと思います。おそらく、特定のニーズから過度に一般化されたいくつかの考え。

1-56592-487-8 のようなシリアル番号をスキャンし、正規表現 /\d-\d{5}-\d{3}-\d/ がこのタイプの一部と一致すると推測します。あるメーカー。(これはたまたま、私の「Java in a Nutshell」のコピーの ISBN-10 です。ISBN はシリアル番号ではありませんが、私と一緒に使用できます。) しかし、いくつかの例から、メーカーがどのパターンを使用しているかを推測することはできません。おそらく、最初の文字位置は 16 進数 (0-F) です。最後の文字は、数字または X (ISBN など) のチェックサムである可能性があります。常に存在するとは限りませんが、植物を表す接尾辞があるかもしれません。そのため、パーツの新しいインスタンスが入ってくると、同じメーカー/パーツ タイプに対して多くのパターンを構築していることに気付くでしょう。

また、逆の問題も発生します。ウィジェットのメーカーは正規表現 /[AZ]{3}\d{7}/ を使用し、ソニック ドライバーのメーカーは同じパターンを使用します。

とはいえ、あなたができる最善のことはこれです:

for each character in the scanned serial number
    if it is a capital letter
        add [A-Z] to the regular expression
    else if it is a digit
        add \d to the regular expression
    else 
        add the character itself to the regular expression, escaped as necessary
 end for
 collapse multiple occurrences with the {,} interval qualifier

車両識別番号のルールも刺激的かもしれません。いくつかの例を挙げて、VIN のルールをどのように推測するかを考えてみてください。

于 2012-05-22T14:11:03.883 に答える
0

EDIT:申し訳ありませんが、私のサンプルコードはバグがあります。推測する部分の最初のステップとして、この種のアルゴリズムが必要です:最長の部分文字列またはこれ

上で説明したように反復といくつかのマスキングを追加する必要があります。また、以下のサンプルでは、​​DVD-RW の「L121」は推測されません (「共通」で開始する必要があると述べたように)。したがって、一般的な連続したサブシーケンスをすべて見つけて、どれが関連しているかを判断する必要があります! (おそらく一種の最大化ゲイン関数を使用)

2 番目のリンク long_substr を使用:

>>> for x in d:
    for y in d:
        if x == y: continue
        common = long_substr([x, y])
        length = len(common)
        if x.startswith(common) and y.startswith(common):
            print "\t".join((x, y, str(length), common))

=>を生成する

0324311071068   0324311071134   10  0324311071
0324311071134   0324311071068   10  0324311071
1613519L121 1613518L121 6   161351
1613519L121 1613509L121 5   16135
WMAYUJ844900    WMAYUJ753738    6   WMAYUJ
WMAYUJ844900    WMAYUJ072099    6   WMAYUJ
WMAYUJ844900    WMAYUJ683739    6   WMAYUJ
WMAYUJ753738    WMAYUJ844900    6   WMAYUJ
WMAYUJ753738    WMAYUJ072099    6   WMAYUJ
WMAYUJ753738    WMAYUJ683739    6   WMAYUJ
1613518L121 1613519L121 6   161351
1613518L121 1613509L121 5   16135
WMAYUJ072099    WMAYUJ844900    6   WMAYUJ
WMAYUJ072099    WMAYUJ753738    6   WMAYUJ
WMAYUJ072099    WMAYUJ683739    6   WMAYUJ
WMAYUJ683739    WMAYUJ844900    6   WMAYUJ
WMAYUJ683739    WMAYUJ753738    6   WMAYUJ
WMAYUJ683739    WMAYUJ072099    6   WMAYUJ
608131237   608131234   8   60813123
1613509L121 1613519L121 5   16135
1613509L121 1613518L121 5   16135
608131234   608131237   8   60813123

--- 最初のバグのある返信はここから始まります

以下は私の返信の最初の部分です。これは、私が間違っていた場所を理解するのに役立つだけであり、いくつかのアイデアを提供する可能性があります。

あなたの特定のニーズに合わせてLongest Common Subsequence probleme solver LCSを使用したサンプルは、何が一般的かを推測するプロセスの最初のステップであると考えることができますか?

これは Python で書かれていますが、上記の最初のリンクの ActiveState Code Recipes を使用すると、簡単に読むことができます (または IDLE (Python エディター) でカット アンド ペーストできます)。

これはバイオインフォマティクスと関係があります (遺伝子配列を考えてください)。

最も興味深い一般的なシーケンスを決定するために何かが必要になります (最小の長さを持っている可能性がありますか?そして、David または私のコメントで既に提案されているようなマスキングに進みます)

(最初は、LCSがLCS連続ソルバーではないことがわかりませんが、必要になるでしょう!だから、LCSソルバーの最初の使用法はバグです:(連続していないため、MAYUJ8またはWMAYUJ7を持っていますが、そうではありませんWMAYUJ - これは短いです! ソルバーは、それらが連続していることを期待せずに最も長い一般的な文字を見つけます! - 申し訳ありません)

>>> raw = """1613518L121
1613509L121
1613519L121

0324311071068
0324311071134

608131234
608131237

WMAYUJ753738
WMAYUJ072099
WMAYUJ683739
WMAYUJ844900"""
>>> d = dict()
>>> for line in raw.split("\n"):
    if not line.strip(): continue
    value = line.strip()
    d[value] = 1

>>> for x in d:
    for y in d:
        if x == y: continue
        length = LCSLength(x, y)
        common = LCS(x,y)
        if  length >= 3 and x.startswith(common):
            print "\t".join((x, y, str(length), common))

=>を生成する

0324311071068   0324311071134   10  0324311071
0324311071068   608131234   4   0324
0324311071134   0324311071068   10  0324311071
WMAYUJ844900    WMAYUJ753738    7   WMAYUJ8
WMAYUJ753738    WMAYUJ072099    7   WMAYUJ7
608131237   608131234   8   60813123
608131234   608131237   8   60813123
于 2012-05-22T14:43:57.217 に答える
-1

スパム検出アルゴリズムを実行します (ベイズのような統計的アルゴリズムまたは類似の「学習」アルゴリズム)。これは役立つかどうかはわかりませんが、そうでない場合は、ここで有用な論理アルゴリズムを作成することは正直ありません。

于 2012-06-03T00:40:11.130 に答える