【问题标题】:Porting regex from PHP to JavaScript将正则表达式从 PHP 移植到 JavaScript
【发布时间】:2009-09-11 14:50:59
【问题描述】:

我在 PHP 中有以下正则表达式:

/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/

我想将它移植到 javascript 中,例如:

var regex = new RegExp('/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/');

var match = regex.exec("hello,my,name,is,'mr jim'")

for( var z in match) alert(match[z]);

这里有一些 JavaScript 不喜欢的东西,但我不知道它是什么。我尝试通过 regular-expressions.info 寻找 PHP 和 JS 正则表达式之间的差异,但我看不到任何明显的东西。

任何帮助将不胜感激

再次感谢您

编辑: 问题似乎在于积极的后视,但这是否意味着它不能被移植?

【问题讨论】:

    标签: php javascript regex


    【解决方案1】:

    正确 - 积极的后视将不起作用。

    但是,就像一些关于 Javascript 中正则表达式的一般信息一样,这里有一些提示。

    您不必使用 RegExp 对象 - 您可以使用模式文字代替

    var regex = /^[a-z\d]+$/i;
    

    但是如果你使用 RegExp 对象,你必须转义你的反斜杠,因为你的模式现在被锁定在一个字符串中。

    var regex = new RegExp( '^[a-z\\d]+$', 'i' );
    

    RegExp 对象的主要好处是如果你的模式有一个动态位,例如

    var max = 4;
    var regex = new RegExp( '\d{1,' + max + '}' );
    

    【讨论】:

    • 谢谢彼得,你可能会说我通常坚持使用 PHP,并且很少在任何一种语言中使用正则表达式。感谢您的建议,将记录下来以备将来参考。
    【解决方案2】:

    你不会向后看(在 IE 中向前看有问题,所以最好也避免)。但是很容易让那些 ' 和 " 字符成为匹配的一部分,然后将它们扔掉:

    var value= "hello,my,name,is,'mr jim'";
    var match;
    var r= /'[^'\s][^']*'|"[^"\s][^"]*"|[^'",\s]+/g;
    
    while(match= r.exec(value)) {
        var text= match[0];
        if ('"\''.indexOf(text.charAt(0))!=-1) // starts with ' or "?
            text= text.substring(1, text.length-1);
        alert(text);
    }
    

    或者,使用捕获括号将引号与文本隔离开来:

    var r= /'([^'\s][^']*)'|"([^"\s][^"]*)"|([^'",\s]+)/g;
    
    while (match= r.exec(value)) {
        var text= match[1] || match[2] || match[3];
        alert(text);
    }
    

    (我猜你的 for(var z in match) 应该循环遍历字符串中的每个模式匹配。不幸的是,JavaScript 并不那么容易工作。)

    这可能不是解析逗号分隔列表的最佳方式;对于字段中间有空格或引号的情况,这似乎有点不明确。一个简单的字符串索引解析器可能是更好的选择。

    【讨论】:

    • 这是完美的。我在前面的lookbehinds中去掉了正则表达式,然后使用replace函数删除引号,你的方法要好得多!谢谢!
    【解决方案3】:

    这是(?&lt;=) 积极的向后看 Javascript 不支持的内容。但请注意,不同浏览器中的 Javascript 实现差异很大。

    编辑:有一个SO question devoted to workaround。

    【讨论】:

    • 你会说不值得尝试移植它,并在服务器端而不是客户端完成所有工作吗?
    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多