RegEx以字母开头和结尾,允许逗号和破折号

时间:2017-02-13 13:22:30

标签: javascript regex

我有这个正则表达式:

/^[\a-zøåæäöüß][\a-z0-9øåæäöüß]*(?:\-?[\a-z0-9øåæäöüß,]+)*$/i

它适用于像"K61-283øÅ,æk-ken,a-sd"这样的疯狂输入,但在案例"word,"上失败了(所以,当只有一个逗号时)。

另外 - 如何限制它应该以每个逗号或短划线后的字母开头(基本上 - 每个单词)?

规则是:以字母开头,以字母数字结尾;允许使用字母数字,短划线和逗号;在每个破折号或逗号之后应该有一个字母

3 个答案:

答案 0 :(得分:1)

更新2:

有两种方法可以查看您的要求。

  1. 自上而下的视图

    我们将输入视为一个或多个单词的列表,以逗号或短划线分隔:

    INPUT = WORD (?: [,\-] WORD )*
    

    每个单词由一个字母组成,后跟零个或多个字母或数字:

    WORD = LETTER [ LETTER DIGIT ]*
    

    转换为JavaScript正则表达式语法,这给了我们:

    WORD = [a-zøåæäöüß][a-zøåæäöüß\d]*
    

    对于整个输入(使用锚点):

    /^[a-zøåæäöüß][a-zøåæäöüß\d]*(?:[,\-][a-zøåæäöüß][a-zøåæäöüß\d]*)*$/i
    

    (这是WiktorStribiżew的回答。)

  2. 自下而上的视图

    我们首先查看允许的字符。我们知道第一个字必须是一个字母。之后,可以有零个或多个输入元素:

    INPUT = LETTER ELEMENT*
    

    每个元素都是

    • 一个字母或数字,或
    • 逗号或破折号,后跟一封信:

    ELEMENT = [ LETTER DIGIT ] | [ COMMA DASH ] LETTER
    

    将其翻译成JavaScript会给我们:

    /^[a-zøåæäöüß](?:[a-zøåæäöüß\d]|[,\-][a-zøåæäöüß])*$/i
    
  3. 这两个正则表达式是等价的。自下而上的正则表达式更短,包含更少的重复代码。另一方面,如果输入字符串主要是字母数字,并且破折号/逗号相对较少,则自上而下的正则表达式可能在某些正则表达式引擎上运行得更快。如果你的输入很短,你可能并不关心微小的性能差异。

    这是您(修订)要求的直接编码:

    /^[a-zøåæäöüß](?:(?:[a-zøåæäöüß\d]|[,\-][a-zøåæäöüß])*[,\-]?[a-zøåæäöüß])?$/i
    

    想法是匹配一个字母,然后是

    • 字符串的结尾(这处理长度为1的输入字符串)或
    • 0个或更多中间体的列表,可选地后跟逗号或短划线,后跟另一个字母

    每个中间体都是

      <击>
    • 一封信,或
    • 一个数字,或
    • 以逗号或短划线后跟字母

答案 1 :(得分:1)

您可以使用

function addoc{
    var name = document.getElementById("nomoc").value;
    var qty = document.getElementById("qtyoc").value;
    var sku = document.getElementById("skuoc").value;
    var prov = document.getElementById("provoc").value;
    var link = document.getElementById("link").value;
    var vt = document.getElementById("vtoc").value;
    var vd = document.getElementById("vdoc").value;
    var obs = document.getElementById("obsoc").value;
    $.get("funciones.php", {
        function : 34,
        name : name,
        qty : qty,
        sku : sku,
        prov : prov,
        link : link,
        vt : vt,
        vd :vd,
        obs : obs
    }, function(data){});
};

请参阅regex demo

<强>详情:

  • /^[a-zøåæäöüß][a-z0-9øåæäöüß]*(?:[-,][a-zøåæäöüß][a-z0-9øåæäöüß]*)*$/i - 字符串开头
  • ^ - 来自已定义集合的信件
  • [a-zøåæäöüß] - 来自已定义集合的0+位数字母
  • [a-z0-9øåæäöüß]* - 零个或多个序列:
    • (?:[-,][a-zøåæäöüß][a-z0-9øåæäöüß]*)* - [-,]-
    • , - 来自已定义集合的信件
    • [a-zøåæäöüß] - 来自已定义集合的0+位数字母
  • [a-z0-9øåæäöüß]* - 字符串结束。

答案 2 :(得分:-1)

试试这个:(允许逗号或短划线后的字母和数字)

/^[a-zøåæäöüß]([a-z0-9øåæäöüß]|(,|-)[a-z0-9øåæäöüß])*[a-zøåæäöüß]$/i

或者:(允许逗号或短划线后的字母)

/^[a-zøåæäöüß]([a-z0-9øåæäöüß]|(,|-)[a-zøåæäöüß])*[a-zøåæäöüß]$/i