In ES 5.1, the regular expression APIs do not expose the index at which a capturing group matched. The RegExp.prototype.exec(string) function returns an Array giving (among other things) the <i>text</i> matched by capturing groups, but does not give the <i>positions </i>of the captured text within the input string.<br>







<br>For example, consider this code using the current regex APIs:<br><span style="font-family:courier new,monospace"></span><br style="font-family:courier new,monospace"><div style="margin-left:40px;font-family:courier new,monospace">




var match = /(fox).*(dog)/.exec("The quick brown fox jumps over the lazy dog");<br>
match[1]; // "fox"<br>match[2]; // "dog"<br></div><br>We want to get this:<br>"fox" at index 16<br>"dog" at index 40<br><br>But there is no way to obtain the indices 16, 40 from the match object (or any other API I'm aware of). This makes it hard to write something like a regex coach, which takes 
an arbitrary regular expression and input string, and outputs a 
highlighted version of the input string showing where the capturing groups matched.<br><br>Proposal: When RegExp.prototype.exec(string) returns a nonnull value, the returned object shall have a property named "captures", which is an Array. The value of captures[n] is the index at which the n'th capturing group's match begins. As usual, groups are numbered from 1. The captures array does not have a "0" property (it would always be equal to the "index" property of the match object, and thus redundant).<br>











<br>Proposed code:<br><br><div style="margin-left:40px"><span style="font-family:courier new,monospace">var match = /(fox).*(dog)/.exec("The quick brown fox jumps over the lazy dog");</span><br style="font-family:courier new,monospace">





<span style="font-family:courier new,monospace">match.captures[1]; // 16<br>match.captures[2]; // 40</span><br>
</div><br>This (combined with the group text from the match object) gives you enough information to enumerate the captured regions of the input string.<br><br>Prior art: Java's java.util.Matcher.start() [1], Python's re.MatchObject.start() [2].<br>

<br>Comments, suggestions?<br>



<br>Mark<br>
<br>[1] <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#start%28int%29" target="_blank">http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#start%28int%29</a><br>[2] <a href="http://docs.python.org/library/re.html#match-objects" target="_blank">http://docs.python.org/library/re.html#match-objects</a><br>











<br>