src/share/classes/java/util/regex/Matcher.java

Print this page

        

*** 23,32 **** --- 23,33 ---- * questions. */ package java.util.regex; + import java.util.Objects; /** * An engine that performs match operations on a {@link java.lang.CharSequence * </code>character sequence<code>} by interpreting a {@link Pattern}. *
*** 368,383 **** * with the given index */ public int start(int group) { if (first < 0) throw new IllegalStateException("No match available"); ! if (group > groupCount()) throw new IndexOutOfBoundsException("No group " + group); return groups[group * 2]; } /** * Returns the offset after the last character matched. </p> * * @return The offset after the last character matched * * @throws IllegalStateException --- 369,409 ---- * with the given index */ public int start(int group) { if (first < 0) throw new IllegalStateException("No match available"); ! if (group < 0 || group > groupCount()) throw new IndexOutOfBoundsException("No group " + group); return groups[group * 2]; } /** + * Returns the start index of the subsequence captured by the given + * <a href="Pattern.html#groupname">named-capturing group</a> during the + * previous match operation. + * + * @param name + * The name of a named-capturing group in this matcher's pattern + * + * @return The index of the first character captured by the group, + * or {@code -1} if the match was successful but the group + * itself did not match anything + * + * @throws IllegalStateException + * If no match has yet been attempted, + * or if the previous match operation failed + * + * @throws IllegalArgumentException + * If there is no capturing group in the pattern + * with the given name + * @since 1.8 + */ + public int start(String name) { + return groups[getMatchedGroupIndex(name) * 2]; + } + + /** * Returns the offset after the last character matched. </p> * * @return The offset after the last character matched * * @throws IllegalStateException
*** 415,430 **** * with the given index */ public int end(int group) { if (first < 0) throw new IllegalStateException("No match available"); ! if (group > groupCount()) throw new IndexOutOfBoundsException("No group " + group); return groups[group * 2 + 1]; } /** * Returns the input subsequence matched by the previous match. * * <p> For a matcher <i>m</i> with input sequence <i>s</i>, * the expressions <i>m.</i><tt>group()</tt> and * <i>s.</i><tt>substring(</tt><i>m.</i><tt>start(),</tt>&nbsp;<i>m.</i><tt>end())</tt> --- 441,480 ---- * with the given index */ public int end(int group) { if (first < 0) throw new IllegalStateException("No match available"); ! if (group < 0 || group > groupCount()) throw new IndexOutOfBoundsException("No group " + group); return groups[group * 2 + 1]; } /** + * Returns the offset after the last character of the subsequence + * captured by the given <a href="Pattern.html#groupname">named-capturing + * group</a> during the previous match operation. + * + * @param name + * The name of a named-capturing group in this matcher's pattern + * + * @return The offset after the last character captured by the group, + * or {@code -1} if the match was successful + * but the group itself did not match anything + * + * @throws IllegalStateException + * If no match has yet been attempted, + * or if the previous match operation failed + * + * @throws IllegalArgumentException + * If there is no capturing group in the pattern + * with the given name + */ + public int end(String name) { + return groups[getMatchedGroupIndex(name) * 2 + 1]; + } + + /** * Returns the input subsequence matched by the previous match. * * <p> For a matcher <i>m</i> with input sequence <i>s</i>, * the expressions <i>m.</i><tt>group()</tt> and * <i>s.</i><tt>substring(</tt><i>m.</i><tt>start(),</tt>&nbsp;<i>m.</i><tt>end())</tt>
*** 516,532 **** * If there is no capturing group in the pattern * with the given name * @since 1.7 */ public String group(String name) { ! if (name == null) ! throw new NullPointerException("Null group name"); ! if (first < 0) ! throw new IllegalStateException("No match found"); ! if (!parentPattern.namedGroups().containsKey(name)) ! throw new IllegalArgumentException("No group with name <" + name + ">"); ! int group = parentPattern.namedGroups().get(name); if ((groups[group*2] == -1) || (groups[group*2+1] == -1)) return null; return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString(); } --- 566,576 ---- * If there is no capturing group in the pattern * with the given name * @since 1.7 */ public String group(String name) { ! int group = getMatchedGroupIndex(name); if ((groups[group*2] == -1) || (groups[group*2+1] == -1)) return null; return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString(); }
*** 1255,1260 **** --- 1299,1317 ---- */ char charAt(int i) { return text.charAt(i); } + /** + * Returns the group index of the matched capturing group. + * + * @return the index of the named-capturing group + */ + int getMatchedGroupIndex(String name) { + Objects.requireNonNull(name, "Group name"); + if (first < 0) + throw new IllegalStateException("No match found"); + if (!parentPattern.namedGroups().containsKey(name)) + throw new IllegalArgumentException("No group with name <" + name + ">"); + return parentPattern.namedGroups().get(name); + } }