【问题标题】:String search logic - not language specific字符串搜索逻辑 - 不特定于语言
【发布时间】:2013-12-19 18:26:07
【问题描述】:

我必须检查地址字段中的数据输入。客户不希望用户使用 Rd 之类的术语。或 Rd 表示道路、大道或大道。对于大道等。我对大多数条款都没有问题。我有问题的地方是'Ave'让我们说。如果我寻找“AVE”,那很好,但它不会在字符串末尾的“AVE”上找到,如果我寻找“AVE”,它会在“Avenue”上得到误报,因为它会找到“Ave” ' 在那个字符串中。有人知道我该怎么做吗?

感谢您的帮助。 诺斯特

虽然 Q: 不是特定于语言的,但这是我在 JS 中的处理方式:

    //function to check address for rd rd. ave ave. st st. etc
function checkaddy() {
    //array of items to look for
    var watchfor = Array();
    watchfor[0] = " RD";
    watchfor[1] = " RD.";
    watchfor[2] = " AVE ";
    watchfor[3] = " AVE.";
    watchfor[4] = " ST ";
    watchfor[5] = " ST.";
    watchfor[6] = " BLVD.";
    watchfor[7] = " CRT ";
    watchfor[8] = " CRT.";
    watchfor[9] = " CRES ";
    watchfor[10] = " CRES.";
    watchfor[11] = " E ";
    watchfor[12] = " E.";
    watchfor[13] = " W ";
    watchfor[14] = " W.";
    watchfor[15] = " N ";
    watchfor[16] = " N.";
    watchfor[17] = " S ";
    watchfor[18] = " S.";
    watchfor[19] = " PKWY ";
    watchfor[20] = " PKWY.";
    watchfor[21] = " DR ";
    watchfor[22] = " DR.";

    //get what the user has in the address box
    var addcheck = $("#address").val();

    //upper case the address to check
    addcheck = addcheck.toUpperCase();

    //check to see if any of these terms are in our address
    watchfor.forEach(function(i) {
        if (addcheck.search(watchfor[i]) > 0 ) {
            alert("Found One!");
        }
    });

}

【问题讨论】:

标签: string logic


【解决方案1】:

也许你需要寻找单词边界字符\b。以下是一些 Ruby 示例:

irb(main):002:0> " Avenue" =~ / AVE\b/i
=> nil
irb(main):003:0> " Ave" =~ / AVE\b/i
=> 0
irb(main):005:0> " Ave" =~ /\bAVE\b/i
=> 1
irb(main):006:0> " Ave" =~ /\bAVE\b/i

注意" Avenue" 不匹配,而" AVE" 匹配。还要注意'\b' 的行为方式,我们分别得到01

在正则表达式中还有其他字符类。因此,您需要做的就是为您的问题集制定正确的 RE。

希望对你有帮助。

【讨论】:

  • tuxdna,是的,看起来我确实需要使用 RE,我还没有使用太多,因为我还在学习。这些似乎能够做我正在寻找的东西。谢谢!
  • @Norst 如果对我的回答有帮助,您能否为我的回答投票? :-)
  • 我检查了它,但我还不能起来,因为我没有所需的代表:o(是的,它非常有帮助。只需要弄清楚如何将 RegExp 放入我的数组中:o )
【解决方案2】:

您的客户为什么要坚持拼写姓名?美国邮政服务实际上鼓励缩写。不仅如此,他们更喜欢地址全部为大写字母且不超过 5 行。这样的规格是他们的自动分拣机的目的。但我离题了。

要真正回答您的问题,您可以考虑以下代码。您的 forEach 声明中有错误。您使用 i 作为索引,但事实上,forEach 函数使用了数组的整个条目。我在下面修改了它。另外,因为我们在 RegExp 的构造函数中使用了字符串表达式,所以 \b 中的 \ 必须被转义,所以我们在字符串中添加了两个 \。因为我们使用\b 构造单词边界,所以我们不需要在测试数组中添加额外的句点。希望对您有所帮助。

//array of items to look for
var watchfor = ['RD','AVE','ST','BLVD','CRT','CRES','E','W','N','S','PKWY','DR'];

//function to check address for rd rd. ave ave. st st. etc
function checkaddy(address) {

    //check to see if any of these terms are in our address
    watchfor.forEach(function(entry) {
        var patt1 = RegExp('.*\\b' + entry + '\\b.*','gim');
        if (patt1.test(address)) {
            document.write("Found " + entry);
        }
    });
}

【讨论】:

  • 感谢我的函数的精简版,当我看到这个时,我正在重写它。是的,我的循环中确实有错误。我最终使用了 $.each(watchfor, function(i) {...}) 至于客户,我完全同意,但他们有内部的 cmets,可以通过地址查找,所以他们需要确保输入一致。我认为这很愚蠢,但我只能争论这么多。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多