在Javascript中返回正则表达式匹配(match)的位置。

13 浏览
0 Comments

在Javascript中返回正则表达式匹配(match)的位置。

在Javascript中,是否有一种方法可以获取正则表达式match()的结果中字符串中起始字符的位置?

0
0 Comments

在现代浏览器中,可以使用string.matchAll()来实现这一目标。与RegExp.exec()相比,这种方法的好处在于它不依赖于正则表达式的状态,就像's answer'中所述。

我运气很好,使用了基于matchAll的这个单行解决方案。

    let regexp = /bar/g;     let str = 'foobarfoobar';     let matchIndices = Array.from(str.matchAll(regexp)).map(x => x.index);     console.log(matchIndices)

但是我不确定为什么你说这种方法不依赖于正则表达式的状态。我尝试了你的代码,没有使用g标志,但是出现了错误。

"g"标志意味着"全局搜索",即在字符串中匹配所有出现的情况。如果你不进行全局搜索,使用str.matchAll()就没有意义。希望这可以帮到你,但我不确定你想要做什么。通过我的"有状态"评论,我是指你不必使用"while"循环并依赖于Regexp对象的内部状态,就像我链接的Gumbo's answer中的方法。祝你好运!

0
0 Comments

问题的原因是作者想要找到正则表达式匹配的文本的起始位置和结束位置,以及如何解决这个问题。

解决方法是使用JavaScript的正则表达式的exec()方法来匹配字符串。作者使用了一个正则表达式来匹配被引号包围的文本,包括带转义字符的双引号和单引号。然后,通过一个while循环来迭代匹配结果,并使用console.log()来打印每个匹配的起始位置和结束位置。

还有另一种获取结束位置的方法,即使用match.index + match[0].length。然后,有人提出了一个问题,认为结束位置应该是match.index + match[0].length - 1。作者解释说,这里的结束位置是排除在外的,类似于.slice().substring()方法的用法。作者还提醒要注意,inclusive通常意味着匹配中最后一个字符的索引,除非是一个空匹配,这时候是在匹配之前的位置,对于开头的空匹配,可能是-1,表示在字符串之外。

最后,有人问如何限制patt = /.*/这样的正则表达式,以防止进入无限循环。

0
0 Comments

问题的出现原因是一个评论者认为`match()`方法不返回`index`属性,而另一个评论者则认为返回了。他们的争论主要集中在`match()`方法和`exec()`方法之间的区别。

根据Mozilla开发者文档中关于`String.prototype.match()`的说明,返回的数组确实有一个额外的`index`属性,表示匹配在字符串中的位置。但是,一些评论者指出,他们在测试中发现`match()`方法并不返回`index`属性。

另一方面,`exec()`方法返回一个对象,其中包含一个`index`属性,表示匹配的位置。这个方法在处理多个匹配时更加方便,因为它可以在循环中使用,每次返回一个匹配结果。

为了解决这个问题,一些评论者建议使用`exec()`方法而不是`match()`方法来获取多个匹配的索引。他们还指出,为了正确使用`exec()`方法,需要将正则表达式的`g`标志添加到正则表达式中,并将其分配给一个变量。

总结起来,这个问题的核心是关于`match()`方法和`exec()`方法之间的区别,以及它们在返回匹配结果时是否包含`index`属性。评论者们的讨论提供了关于如何正确使用这些方法以及它们的行为差异的见解。

以下是评论者们的观点和解释的整理:

- `match()`方法返回的数组具有`index`属性,表示匹配的位置。

- 一些评论者在测试中发现`match()`方法并不返回`index`属性。

- `exec()`方法返回一个对象,其中包含`index`属性,用于表示匹配的位置。

- 使用`exec()`方法可以在处理多个匹配时更加方便,因为它可以在循环中使用。

- 为了正确使用`exec()`方法,需要将正则表达式的`g`标志添加到正则表达式中,并将其分配给一个变量。

这些评论者的观点和解释提供了关于如何在JavaScript中获取正则表达式匹配位置的不同方法和技巧。它们为开发者提供了更好的理解,以便根据具体的需求选择合适的方法。

0