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

到目前为止我做了什么:

这是我在网上找到并适应我的情况:

在codinghorror.com上找到的公式:

(?!kid|KID|Kid\b)\b\w+ - 这适用于“KID”,但当我出于某种原因添加任何其他内容时失败

在 stackoverflow.com 上找到的公式:

^(?!kid$).* - 匹配一切 - 甚至是“孩子”

^((?!kid).)*$ - 相同的

这是我第一次使用正则表达式,我只需要一点帮助就可以开始使用它。

因此,您可以给我的任何帮助或指示将不胜感激。

谢谢!

4

2 回答 2

0

我强烈建议您为您的导入工作寻找不同的解决方案,因为这会很快变得笨拙。但是,如果您真的想在这里构建一个至少可以满足您要求的正则表达式(如果我对您的理解正确,并且您的正则表达式引擎支持这种形式,因为您没有提及您使用的是哪个形式) )。

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

这样做是 ^ 匹配字符串的开头和 $ 字符串的结尾(或者有时是行的开头和结尾,但如果这些都是单行值,那么没关系)。您可以将任何内容包含在 (?!) 中以表示“如果匹配则不匹配”并且 .* 完全匹配任何内容。推杆 | 在 2 个模式之间匹配其中任何一个模式。因此,如果中间的任何字符串由 | 分隔 匹配并且之前或之后没有任何内容(这就是 ^ 和 $ 的意思)然后 (?!) 中的位匹配,如果匹配,则整个事物匹配。如果第一位是好的,那么 .* 将匹配任何东西,所以整个事情都会匹配。

所以你就是这样做的,但请考虑重新考虑这个问题,因为几乎可以肯定有更好的解决方案来解决你正在尝试做的事情。祝你好运!

于 2013-09-16T19:41:33.257 回答
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 回答