具有非全局正则表达式的“match”和“exec”似乎返回第一个匹配项两次
`match` and `exec` with non-global regex appear to return the first match twice
我不太了解JavaScript正则表达式方法的行为。
问题是我无法在没有全局标识符的情况下让 /(something|something)/
类型的正则表达式使用match
或exec
方法,例如 /(somereg1|somereg2)/g
.
当全局标识符存在时,这些方法会正确返回它找到的每个实例。但是当它不存在时,两种方法都正确返回它们找到的第一个匹配项。问题是他们似乎返回了两次。例如:
const str = "Here is somereg1 and somereg2";
str.match(/(somereg1|somereg2)/)
我希望这个match
电话能返回"somereg1"
.相反,它似乎返回"somereg1,somereg1"
。
检查此 JSFiddle。代码应该是相当不言自明的。第一个例子取自W3Schools。
第一个元素是正则表达式的完全匹配。如果您尝试过此操作:
const str = "Here is somereg1 and somereg2";
str.match(/.*(somereg1|somereg2)/)
您的结果将是[ "Here is somereg1 and somereg2", "somereg2" ]
.
.exec(str)
方法调用也会发生相同的行为。
您可能想阅读有关.match
和.exec
的信息。
关于"子括号匹配":在正则表达式中,括号分隔捕获组。所以,如果你有这个正则表达式:
/.*(somereg1).*?(somereg2)/
您的.match
结果将是[ "Here is somereg1 and somereg2", "somereg1", "somereg2" ]
。因此,如您所见,结果数组由完全匹配项组成,后跟所有捕获组匹配项。
并且要强制一个组不被俘虏,只需用(?:
和)
划定界限:
"Here is somereg1 and somereg2".match(/.*(?:somereg1).*?(somereg2)/);
// Will result in [ "Here is somereg1 and somereg2", "somereg2" ].
请注意,g
(全局(标志更改了match
的返回语义:它们将返回一个完整匹配的数组,捕获组将被忽略。 另一方面,exec
始终返回RegExp
实例当前lastIndex
之后的匹配的完整匹配和捕获组匹配。为方便起见,可以改用 matchAll
,它返回所有匹配项(包括所有捕获组(的迭代器。
您可以使用以下内容来获取请求结果:
var str = "Here is somereg1 and somereg2" //I would expect
str.match(/(?=(somereg1|somereg2))/)
至于比赛和执行。我会说去匹配,因为它使用正则表达式对象并防止您双重转义,并且全部用于用作 re 的字符串。
修改第二行,如下所示:
str.match(/somereg1|somereg2/)
- 尝试在两次迭代中警告同一选择器的值,在第一次迭代中得到正确的值,而在第二次迭代中获得不正确的值.为什么?
- 两个提交按钮,但第一个返回空
- 我这里有两个表格,在提交验证第一个表格后,我如何转到第二个表格进行验证
- 在页面中使用了两次多个图像上传,但第一个正在工作,另一个不起作用
- 如何使用 jQuery 交换网页中的两个图像(连续两次点击)
- 查找与通过两次调用地理编码创建的两个 latlng 对象的距离
- 在if语句中检查这两个条件,即使第一个条件为false
- Angular 2:当第一个服务成功时,两个后端服务调用
- 如何在两个连续的角度服务呼叫期间中止/取消第一个呼叫的承诺
- 两个选项卡—第一个选项卡在第二个选项卡中处于调试模式时被卡住
- 若在两个不同的选项卡中打开同一个页面,如何防止javascript运行两次
- 页面加载后的第一个锚定链接需要单击两次
- 在节点中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺
- jQuery:当使用.click,.trigger()进行操作时,只有两个.click()事件中的第一个会运行
- 为什么是Backbone.Collection为第一个查看器显示了两次
- 我在一页上有两个简单的javascript幻灯片,但第二个停止了第一个工作
- 如何在 JavaScript 中检查多个对象属性两次
- 具有非全局正则表达式的“match”和“exec”似乎返回第一个匹配项两次
- 在同一元素上单击两次,然后在另一个元素上单击两次,使第一个元素进入“单击”状态
- 在JavaScript中,第一个绑定决定了谁“;这个“;是(绑定两次或第二次并不重要)