当它包含错误时,我如何找到匹配的字符串?

时间:2014-05-30 20:30:28

标签: javascript regex string string-comparison

这不是关于string1 == string2。它有点复杂: - )

我有不同的人创建了大量的PDF文件,并在电子表格文件中报告文件名。 (这个程序很长时间不会改变,所以请不要这么做......)

每周我都要检查列表中的所有文件是否也可以作为PDF格式使用。 字符串必须是IDENTICAL,当然总是存在各种错误。 大写与小写,空白缺失,开头空白,字符遗漏,插入错误字符...

所以目前我正在编写一个脚本,该脚本应该在两个列表中找到所有那些在其他列表中没有匹配的字符串。 字符串的共同点是,它们包含日期和数字。这个数字主要是,但并不总是唯一的。 当数字被多次使用时,字符串的其余部分是不同的。

到目前为止,我可以找到混合大写和小写引起的错误。这很简单。 当错误是由一个字符遗漏引起的时候,我的脚本可以找到匹配。

我现在的问题是:当多个字符错误和/或stringlength不同时,如何找到匹配的字符串?

这就是字符串的样子:

mip - 20140512 - 11     Mip - 20140512 - 11
mip - 20140512 - 27     MiP - 20140512 - 27
mip - 20140512 - 33     mip -20140512 - 33
coty - 20140512 - 35    cotY -20140512 -35

3 个答案:

答案 0 :(得分:0)

很好地解决了大小写和空格,您可以将所有内容作为小写进行比较并删除所有空格。

var str = "Hello World!";
    var tst = "helloworld!";

var res = str.toLowerCase();
res = res.replace(" ", "");
    if(str == tst)
    {
      // it worked
    }

这可能无法解决所有问题,但我认为应解决大多数问题。 应该解决你发布的例子。

答案 1 :(得分:0)

您可以使用正则表达式以轻松的方式解析字符串,例如:

MatchCollection m = Regex.Matches(str, @"^\s*([a-z]+)\s*-\s*(\d+)\s*-\s*(\d+)\s*$", RegexOptions.IgnoreCase);

这将允许前导和尾随空格,破折号周围的可选空格以及混合的大写和小写字符。

然后,您可以将匹配的部分放在一个格式良好的字符串中:

if (m.Count == 1) {
  string wellFormed = m[0].Groups[1].Value.ToLower() + " - " + m[0].Groups[2].Value + " - " + m[0].Groups[3].Value;
  ...
}

这会将字符串"cotY -20140512 -35"转换为"coty - 20140512 - 35"

如果字符串与模式不匹配,m.Count为零,您可能希望进行二次检查,或将其拒绝为无效字符串。

您可能希望根据需要使模式更加轻松或放松,例如要求日期精确匹配8位数((\d{8}))。

答案 2 :(得分:0)

您列出的样本中有一个共同的模式。如果始终如此,您可以构建一个使用该模式规范化所有文件名的正则表达式。一旦它们全部归一化,就很容易找到匹配。

var coll=[
    ['mip - 20140512 - 11'], 
    ['mip - 20140512 - 27    '],
    ['mip - 20140512 - 33   '] ,
    ['coty - 20140512 - 35  '] ,
    ['Mip - 20140512 - 11'],
    ['  MiP - 20140512 - 27'],
    ['mip -20140512 - 33'],
    ['cotY -20140512 -35']
];


var regx = new RegExp(/([A-Za-z]*)\s*-\s*(\d*)\s*-\s*(\d*)/);
// ([A-Za-z]*)  ... Match1 [$1] group of letters
// \s*          ... followed by zero or more spaces
// -            ... followed by a hypen
// \s*          ... followed by zero or more spaces
// (\d*)        ... Match2 [$2] a group of digits
// \s*          ... followed by zero or more spaces
// -            ... followed by a hyphen
// \s*          ... followed by zero or more spaces
// (\d*)        ... Match3 [$3] a group of digits

function cleanAndPush(el){
    el.push(
        el[0].trim().replace(regx,"$1-$2-$3").toUpperCase()
    );
}

coll.map(cleanAndPush);

http://jsfiddle.net/fH95m/