代码之家  ›  专栏  ›  技术社区  ›  Chris

JavaScript中的正则表达式与PHP中的正则表达式不同

  •  2
  • Chris  · 技术社区  · 14 年前

    我有一个正则表达式来匹配用户名(在PHP中使用 preg_match ):

    /[a-z]+(?(?=\-)[a-z]+|)\.[1-9][0-9]*/
    

    此模式匹配窗体的用户名 abc.124 , abc-abc.123 等等。

    但是,当我将此转换为JavaScript时:

    var re = new RegExp("/[a-z]+(?(?=\-)[a-z]+|)\.[1-9][0-9]*/"); 
    

    SyntaxError: Invalid regular expression: /[a-z]+(?(?=-)[a-z]+|).[1-9][0-9]*/: Invalid group
    

    这个 (?(?=\-)[a-z]+|) 是说如果 [a-z]+ 我们看到一个 - 那就断言

    编辑:我很感谢大家的评论,现在我有最后一个问题:

        var str="accouts pending removal shen.1206";
        var patt= new RegExp("/[a-z]+(?:-[a-z]+)?\.[1-9][0-9]*/"); 
        var result=patt.exec(str);
        alert(result); 
    

    null ? 但如果我做了以下事情,它就会起作用:

    var patt=/[a-z]+(?:-[a-z]+)?\.[1-9][0-9]*/;
    var result=patt.exec(str);
    alert(result); 
    

    3 回复  |  直到 13 年前
        1
  •  5
  •   Daniel Vandersluis    14 年前

    不同的正则表达式引擎支持不同的特性。 Conditionals not supported 通过Javascript。

    在任何情况下,您的模式都不需要条件。我想把你的表达简化为 /[a-z]+(?:-[a-z]+)?\.[1-9][0-9]*/ PCRE 在Javascript中。

        2
  •  3
  •   Gumbo    14 年前

    (?(?=regex)then|else) (见 comparison of regular expression flavors ). 但您可以使用以下与您的正则表达式等效的正则表达式:

    /[a-z]+(?:-[a-z]+)?\.[1-9][0-9]*/
    

    当使用 RegExp 构造函数来创建正则表达式(而不是 regular expression literal syntax /…/ \ 我也是。所以:

    var re = /[a-z]+(?:-[a-z]+)?\.[1-9][0-9]*/;                 // OR
    var re = new RegExp("/[a-z]+(?:-[a-z]+)?\\.[1-9][0-9]*/");
    
        3
  •  2
  •   Alan Moore Chris Ballance    14 年前

    你的条件语句甚至在PHP中也不起作用。展望- (?=-) -如果下一个字符是连字符,则成功,但不是 消费 连字符。那么 [a-z]+ - . 你必须重新匹配连字符- -[a-z]+

    条件句是诱人的;它们 似乎 它们应该很有用,但实际上很少有用。它们通过反映我们对某些问题的自然思考方式来吸引我们:“我想匹配一些字母,如果后面的字符是连字符,我想匹配它和更多的字母。”

    /[a-z]+(?:-[a-z]+)?/
    

    (The) \.[1-9][0-9]* 你的正则表达式的一部分很好;我省略了它,这样我就可以专注于条件方面。)


    abc.124 abc-abc.123 匹配的字符串:

    Array
    (
        [0] => Array
            (
                [0] => abc.124
                [1] => abc.123
            )
    
    )
    

    [答-答]+ 最初匹配第一个 abc abc-abc.123 . 那么前瞻性与 - 不消耗它和第二个 尝试匹配连字符,但失败了,如我前面所说。

    在该位置找不到匹配项后,regex引擎开始一次前进一个字符,然后再试一次。当它到了第二个 abc公司 ,第一个 [答-答]+

    输入字符串中的下一个字符是 . ,因此前瞻失败。不需要条件匹配任何内容,因为您没有为 else 条款。所以条件不匹配,控制传递到正则表达式的下一部分, \.[1-9][0-9]* ,成功了。