【问题标题】:Why this javascript regex doesn't work?为什么这个 javascript 正则表达式不起作用?
【发布时间】:2011-11-17 16:03:56
【问题描述】:

我正在做一个小的 javascript 方法,它接收一个点列表,我必须读取这些点以在谷歌地图中创建一个多边形。

我在表格上收到了这些要点:

(纬度,经度),(纬度,经度),(纬度,经度)

所以我做了以下正则表达式:

\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)

我已经用RegexPal 和我收到的确切数据对其进行了测试:

(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)

它可以工作,那么为什么当我在我的 javascript 中添加这段代码时,我会在结果中收到 null 呢?

var polygons="(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)";
var reg = new RegExp("/\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g");
var result = polygons.match(reg);

执行时我没有 javascript 错误(使用谷歌浏览器的调试模式)。此代码托管在包含的 JS 文件中的 javascript 函数中。该方法在 OnLoad 方法中被调用。

我已经搜索了很多,但我找不到为什么这不起作用。非常感谢!

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    使用regex literal [MDN]

    var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
    

    您在使用RegExp [MDN] 时犯了两个错误:

    • “分隔符”/ 不应成为表达式的一部分
    • 如果将表达式定义为字符串,则必须对反斜杠进行转义,因为它是字符串中的转义字符

    此外,修饰符作为第二个参数传递给函数。

    因此,如果您想使用 RegExp(在这种情况下您不必这样做),则等效为:

    var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g");
    

    (我想现在你明白为什么正则表达式更方便了)


    我总是发现在控制台中复制并粘贴 RegExp 表达式并查看其输出很有帮助。取你原来的表达,我们得到:

    /(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g
    

    这意味着表达式尝试按字面意思匹配/sg,而括号() 仍被视为特殊字符。


    更新: .match() 返回一个数组:

    ["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]
    

    这似乎不是很有用。

    您必须使用.exec() [MDN] 来提取数字:

    ["(25.774252, -80.190262)", "25.774252", "-80.190262"]
    

    这必须重复调用,直到处理完整个字符串。

    例子:

    var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
    var result, points = [];
    
    while((result = reg.exec(polygons)) !== null) {
        points.push([+result[1], +result[2]]);
    }
    

    这会创建一个数组数组,而一元加号 (+) 会将字符串转换为数字:

    [
        [25.774252, -80.190262], 
        [18.466465, -66.118292], 
        ...
    ]
    

    当然,如果您希望将值作为字符串而不是数字,则可以省略 +

    【讨论】:

    • 太好了,成功了!我不知道这个合成器。小问题:我收到一个带有结果的数组,但是如何检索我的捕获内容“(...)”?(this:([0-9.-]+))
    • 我犯了一个错误,你必须保留g修饰符。你只需要使用exec。请查看更正后的版本。
    • 虽然这是一个相当古老的答案,但它确实帮助我完成了表单验证。 ' \ 处多余的' \ '。 '最后做到了:)
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多