8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么这个 javascript 正则表达式不起作用?

Lutz Prechelt 1月前

43 0

我正在做一个小型的 javascript 方法,它接收一个点列表,我必须读取这些点以在谷歌地图中创建一个多边形。我以以下形式接收这些点:(纬度,经度),(纬度,经度),...

我正在做一个小型的 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 错误(使用 Google Chrome 的调试模式)。此代码托管在包含的 JS 文件中的 javascript 函数中。此方法在 OnLoad 方法中调用。

我搜索了很多,但还是找不到为什么它不起作用。非常感谢!

帖子版权声明 1、本帖标题:为什么这个 javascript 正则表达式不起作用?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Lutz Prechelt在本站《regex》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 使用 regex literal [MDN] :

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

    RegExp [MDN] 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
    

    这意味着表达式尝试匹配 / , s g 并且括号 () 仍然被视为特殊字符。


    更新: .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。请查看更正后的版本。

  • 虽然这是一个相当古老的答案,但它确实帮助我完成了表单验证。' \ . ' 处的额外 ' \ ' 在最后完成了它:)

返回
作者最近主题: