字符串搜索逻辑 - 不是语言特定的

时间:2013-12-19 18:26:07

标签: string logic

我必须检查地址字段上的数据输入。客户不希望用户使用像Rd这样的术语。或道路,大道或大道的道路。对于大道等我对大多数条款没有任何问题。我有问题的地方是'Ave'。如果我寻找'AVE',那很好,但它不会在字符串的末尾拾取'AVE',如果我寻找'AVE',它会在'Avenue'上得到误报,因为它会找到'Ave' '在那个字符串中。任何人都知道如何解决这个问题?

感谢您的帮助。 NORST

虽然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!");
        }
    });

}

2 个答案:

答案 0 :(得分:0)

也许你需要寻找单词边界字符\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。

我希望有所帮助。

答案 1 :(得分:0)

为什么您的客户会坚持拼写出姓名?美国邮政服务实际上鼓励缩写。不仅如此,他们更喜欢地址全部是大写字母,不超过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);
        }
    });
}