JavaScript中的正则表达式非捕获组

9

我对正则表达式和JavaScript有点生疏。 我有以下字符串变量:

var subject = "javascript:loadNewsItemWithIndex(5, null);";

我想使用正则表达式提取数字 5。这是我的正则表达式:
/(?:loadNewsItemWithIndex\()[0-9]+/)

应用方法如下:

subject.match(/(?:loadNewsItemWithIndex\()[0-9]+/)

结果是:
loadNewsItemWithIndex(5

如何以最简单明了的方式将5提取为一行代码?有没有可能通过排除匹配项中的 loadNewsItemWithIndex( 而不是将5作为子组进行匹配来实现这一点?

3个回答

8
String.match的返回值是一个匹配结果的数组。所以你可以在数字部分周围加上括号,并仅检索特定的匹配索引(第一个匹配是整个匹配结果,后续条目用于每个捕获组):
var subject = "javascript:loadNewsItemWithIndex(5, null);";
var result = subject.match(/loadNewsItemWithIndex\(([0-9]+)/);
                                    //             ^      ^  added parens
document.writeln(result[1]);
                  //    ^ retrieve second match (1 in 0-based indexing)

示例代码:http://jsfiddle.net/LT62w/

编辑:感谢@Alan对非捕获匹配的工作原理进行了纠正。

实际上,它完美地工作。在非捕获组中匹配的文本仍然会被消耗,就像在任何组外匹配的文本一样。捕获组就像具有额外功能的非捕获组:除了分组之外,它还允许您独立于整体匹配提取与其匹配的任何内容。


非捕获匹配似乎无法正常工作。我知道JavaScript中有一些奇怪的正则表达式行为,但我认为这个问题是因为我有点生疏。 - Benedict Cohen
1
实际上,它运行得非常完美。在非捕获组中匹配的文本仍然被“消耗”,就像在任何组外匹配的文本一样。捕获组类似于具有额外功能的非捕获组:除了分组之外,它允许您独立提取其匹配的任何内容,而不受整体匹配的影响。 - Alan Moore
结果数组的索引与正则表达式的“组”编号匹配(从1开始)。 - FizxMike

4
我相信以下的正则表达式对你有用:

我相信以下的正则表达式对你有用:

loadNewsItemWithIndex\(([0-9]+).*$

var test = new RegExp(/loadNewsItemWithIndex\(([0-9]+).*$/);
test.exec('var subject = "javascript:loadNewsItemWithIndex(5, null);";');

这段话的意思是:“这可以分解为”。
loadNewsItemWithIndex = exactly that

\( = open parentheses 

([0-9]+) = Capture the number
.* = Anything after that number

$ = end of the line

你是正确的。我在脑海中思考时添加了它,但从未将其删除。 - Ryan Matthews
1
所以.*$也是基于同样的原因。 - davin

3
这应该就够了:
<script>
var subject = "javascript:loadNewsItemWithIndex(5, null);";
number = subject.match(/[0-9]+/);
alert(number);
</script>

3
最佳答案,根据所提供的上下文进行翻译。 - Matteo Riva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接