当前位置: 首页 > 面试题库 >

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

董宜然
2023-03-14
问题内容

我正在做一个小的javascript方法,该方法会接收到一个点列表,并且我必须阅读这些点才能在Google地图中创建多边形。

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

(lat,long),(lat,long),(lat,long)

因此,我完成了以下正则表达式:

\(\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方法中调用此方法。

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


问题答案:

使用正则表达式文字[MDN]

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

使用RegExpMDN时出现两个错误:

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

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

因此,如果您要使用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], 
    ...
]

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



 类似资料:
  • 问题内容: 试图了解正则表达式,我在重复的部分:。 我有以下代码: 如您所见,两个字符串都不匹配该模式。为什么会这样呢? 问题答案: 您不应该在逗号后加空格,这是多余的。

  • 问题内容: 在下面的代码段中,匹配结果中的 非捕获组应被忽略, 结果应该是。 但是,我得到了匹配结果。仅当我指定group(2)时才显示。 问题答案: 并返回整个比赛。随后的组是实际的捕获组。 如果您想要相同的行为:

  • 问题内容: 我写了一个正则表达式来从HTML提取字符串,但是多行标志似乎不起作用。 这是我的模式,我想在标签中获取文本。 我创建了一个字符串来测试它。当字符串包含“ \ n”时,结果始终为null。如果删除所有的“ \ n”,无论有没有标志,它都会给我正确的结果。 我的正则表达式怎么了? 问题答案: 您正在寻找修饰符,也称为 dotall 修饰符。它将强制点也匹配换行符,默认情况下 不这样做 。

  • 问题内容: 琐碎的正则表达式问题(答案很可能是特定于Java的): 这将返回false。据我所知,是指它始终意味着的含义,没有特殊含义,因此我将其翻译为“字符串开头的’#’”。哪个应该匹配。在Perl中也是如此: 打印“ 1”。所以我很确定答案是特定于Java的。有人能启发我吗? 谢谢。 问题答案: 检查 整个输入字符串 是否与正则表达式匹配。 由于您的正则表达式仅与第一个字符匹配,因此它返回。

  • 问题内容: 我知道进行解析时,我应该理想地删除所有空格和换行符,但是我只是为了快速解决此问题,所以不知道为什么它不起作用。带有“ #### 1”之类的包装器的文档,并尝试基于此进行解析,但是无论我尝试如何,它都无法正常工作,我认为我正确地使用了多行。 这根本不会返回任何结果: 问题答案: 尝试(当然也可以)。 此正则表达式将返回包含节号和节内容的元组。 对于您的示例,这将返回。 (顺便说一句:您的

  • 问题内容: 我有一个正则表达式: 这应该与该字符串匹配并返回三个捕获(根据Rubular) 这是我的代码: 当有三个时,此打印输出1(组),所以我只能这样做,只会返回32。 问题答案: 调用查找匹配的 下一个 实例,如果没有更多实例,则返回false。尝试调用它三次,看看是否有所有预期的组。 为了澄清,正在尝试 在正则表达式中 找到第一个组 表达式 。您的正则表达式中只有一个这样的组表达式,因此永