0

この質問は、このサイトやオンラインの他のサイトで見つけた正規表現に関する他の多くの質問と似ています。ただし、ソリューションを実装しようとしても機能しませんでした。うまくいかなかったのは私の無知によるものですが、次のことについて助けてもらいたいです。

私がやろうとしていること:

新しいデータベースへのデータのインポートに取り組んでいます。変換のほとんどは数か月前に行われましたが、今はすべての新しいデータを変換する必要があります。

環境に関する一般情報:

特定のフィールドを正しく変換するには、正規表現を使用する必要があります。新しいデータベースのフィールドには、次の 3 つの値のいずれかを保持できます。

- Kid
- No Mail
- Household

ただし、ソース ファイルの列には、無視したい値がさらに多くあります。

インポート プログラムには、インポートされた値をデータベースの標準値に変換するために特定のフィールドに適用できる「辞書」を作成する機能があります。これは、一般的なタイプミスなどを修正するのに最適です。

辞書はとてもシンプルです。正しい値のリストがあり、それぞれの正しい値にはいくつかの間違った値が含まれている可能性があります。

例えば:

    CORRECT VALUE           IMPORT VALUES
    Kid                     kid
                            kids
                            Child
                            Minor

インポート値リストでは、正規表現も入力できます。

解決すべき問題:

辞書ファイルのサンプルを次に示します。

     CORRECT VALUE LIST     IMPORT VALUE
  -  Kid                    Kid
                            KID

  -  No Mail                No Mail
                            NO MAIL

  -  Household              HH

  -  OTHER                Regex expression to match: Anything else

例:

入力値:

  • KID に変換します Kid
  • HH に変換します Household
  • John に変換します OTHER
  • Do Not Call に変換します OTHER
  • NO MAIL に変換します No Mail
  • ABCD に変換します OTHER

これまでに行ったこと:

これは私がオンラインで見つけたもので、私の場合に適応しています:

コーディングホラー.comで見つけた数式:

(?!kid|KID|Kid\b)\b\w+ - これは 'KID' で機能しますが、何らかの理由で他のものを追加すると失敗します

stackoverflow.com で見つかった数式:

^(?!kid$).* - すべてに一致 -「Kid」も含む

^((?!kid).)*$ - 同じ

正規表現を使用する必要があるのはこれが初めてで、使い始めるには少し助けが必要です。

ですから、あなたが私に与えることができる助けや指針は大歓迎です。

ありがとう!

4

2 に答える 2

0

長い話を短くすると、可能な出力値のリストがあり、そのような値ごとに、入力で「一致」する可能な値の有限セットがあります。matchesこれらは大文字と小文字を区別しないように見えますが、実際にはすべてがそうであるとは限りません。

ここでの作業は簡単です。入力文字列ごとに、このセットとの照合を試みます。特定のパターンに一致する場合は、それが属する出力値を見つけて、結果セットに配置します。そうでない場合は、設定した空白の値を使用します(私が理解しているように、空の文字列)。

理論から実践まで、JavaScript でこのアプローチを実装する方法は次のとおりです。

// defining the dictionary: each key is a possible output value,
// each element is a list of matching words
var dictionary = {
    Kid:       ['kid', 'kids', 'child', 'minor'],
    'No Mail': ['no mail'],
    HouseHold: ['HH']
};
var defaultOutput = ''; // self-explanatory

// preparing the dictionary of patterns
var outputs = Object.keys(dictionary), 
    patternsToMatch = {};

outputs.forEach(function(outValue) {
    var alternationPart = dictionary[outValue].join('|');
    patternsToMatch[outValue] = new RegExp(
        '^(?:' + alternationPart + ')$', 'i');
});

// actually processing the inputs:
var testInputs = ['KiD', 'kidi', 'cHiLd', 'no mail', 'no email'];
console.log(testInputs);

var results = testInputs.map(function(inputStr) {
    var matchingOutput = defaultOutput;
    outputs.some(function(outputVal) {
        if (patternsToMatch[outputVal].test(inputStr)) {
            matchingOutput = outputVal;
        }
        return matchingOutput !== defaultOutput;
    });
    return matchingOutput;
});
console.log(results);

JSフィドル

それは単純です (そして、前述の大文字と小文字の区別の問題など、いくつかのコーナーがカットされています) が、(うまくいけば) 考える方向性を示しています。

于 2013-09-16T20:41:54.733 に答える
0

インポート作業は非常に速く扱いにくくなるため、別の解決策を探すことを強くお勧めします。ただし、本当に必要な場合は、少なくともあなたが求めていることを実行する正規表現を作成する方法を次に示します (私があなたを正しく理解している場合、および正規表現エンジンがこのフォームをサポートしている場合、使用しているものについて言及していない場合) )。

(?!^(kid|KID|Kid|no mail)$).*

つまり、^ は文字列の先頭に一致し、$ は文字列の末尾に一致します (または、行の先頭と末尾に一致する場合もありますが、これらがすべて 1 行の値である場合は問題ありません)。(?!) で何かをラップして、「これが一致する場合は一致しない」ことを意味し、.* は何にでも一致します。パッティング | between 2 pattern は、これらのパターンのいずれかに一致します。したがって、 | で区切られた真ん中の文字列のいずれかが 一致し、前後に何もない場合 (^ と $ の意味)、(?!) 内のビットが一致し、それが一致する場合、全体としては一致しません最初のビットが OK の場合、.* は何にでも一致するため、全体として一致します。

それがあなたのやり方ですが、あなたがやろうとしていることに対するより良い解決策がほぼ確実にあるので、問題を再考することを検討してください. 幸運を!

于 2013-09-16T19:41:33.257 に答える