【问题标题】:Javascript Regex For Comma Delimited String用于逗号分隔字符串的 Javascript 正则表达式
【发布时间】:2012-06-01 22:29:43
【问题描述】:

我需要一个对 input/type=hidden 字段的值执行“包含”功能的正则表达式。此隐藏字段将唯一值存储在逗号分隔的字符串中。

这是一个场景。
value: "mix" 需要添加到隐藏字段。仅当它不作为逗号分隔值存在时才会添加。

由于我对正则表达式的了解有限,我无法阻止搜索返回所有出现的“混合”值。例如,如果:hiddenField.val = 'mixer, mixon, mixx',则正则表达式总是返回 true,因为这三个单词都包含“mix”字符。

提前感谢您的帮助

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您可以使用\b 元字符来设置单词边界:

    var word = "mix";
    new RegExp("\\b" + word + "\\b").test(hidden.value);
    

    演示: http://jsfiddle.net/ztYff/


    更新。为了保护我们的正则表达式在使用变量而不是硬编码时可能出现的问题(参见下面的 cmets),我们需要转义 word 变量中的特殊字符。 One possible solution是使用如下方法:

    RegExp.escape = function(text) {
        return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
    }
    

    演示: http://jsfiddle.net/ztYff/1/


    更新 2.@Porco's answer 之后,我们可以结合正则表达式和字符串拆分来获得另一个通用解决方案:

    hidden.value.split(/\s*,\s*/).indexOf(word) != -1;
    

    演示: http://jsfiddle.net/ztYff/2/

    【讨论】:

    • 这不是一个好主意。你真的应该正则表达式引用word 以避免运行时错误。
    • @Tomalak 不太明白你的意思。你能举个例子吗?
    • 如果word 包含反斜杠怎么办?还是美元符号?这将破坏您的解决方案。 (不是在这种特殊情况下,但通常是当您从字符串构建正则表达式时。)
    • @Tomalak 啊...好吧,它会破坏任何像这样的通用解决方案。当然,单词应该是安全的。让我想想更好的办法。
    • @Tomalak 现在正则表达式应该受到保护。
    【解决方案2】:
    hiddenField.val.split(',').indexOf('mix') >= 0
    

    也可以使用正则表达式(startofstring OR comma + mix + endofstring OR comma):

    hiddenField.val.match(/(,|^)mix($|,)/)
    

    【讨论】:

    • Array.prototype.indexOf 仅在 IE9 中受支持。
    • MDN 有一个向后兼容的 indexOf() 实现,适用于缺少它的浏览器:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
    • 为替代方法添加了正则表达式
    • 我喜欢你的简单回答。我需要做一些性能测试,看看这两个操作:split 和 indexOf 是否会比单个正则表达式执行得更快。
    【解决方案3】:
    hiddenField.val.match(/^(mix)[^,]*/);
    

    【讨论】:

      【解决方案4】:

      怎么样:

      /(^|,)\s*mix\s*(,|$)/.test(field.value)
      

      匹配mix,无论是在字符串的开头还是结尾或逗号之间。如果列表中的每个条目都可以包含多个单词,您可能需要删除 \s*

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多