public final class Matcher extends Object implements MatchResult
Pattern
。
通过调用模式的matcher
方法从模式创建匹配器。 创建后,可以使用匹配器执行三种不同类型的匹配操作:
这些方法中的每一个返回一个指示成功或失败的布尔值。 通过查询匹配器的状态可以获得有关成功匹配的更多信息。
匹配器在其输入的子集中找到称为该区域的匹配项。 默认情况下,该区域包含所有匹配器的输入。 该区域可以通过region
方法修改,并通过regionStart
和regionEnd
方法进行查询。 区域边界与某些模式构造交互的方式可以改变。 有关详细信息,请参阅useAnchoringBounds
和useTransparentBounds
。
该类还定义了用新字符串替换匹配子序列的方法,如果需要,可以根据匹配结果计算其内容。 appendReplacement
和appendTail
方法可以串联使用,以便将结果收集到现有的字符串缓冲区中,或者可以使用更方便的方法来创建一个字符串,其中输入序列中的每个匹配子序列都被替换。
匹配器的显式状态包括最近成功匹配的开始和结束索引。 它还包括由模式中的每个capturing group捕获的输入子序列的开始和结束索引以及这些子序列的总计数。 为了方便起见,还提供了用于以字符串形式返回这些捕获的子序列的方法。
最初未定义匹配器的显式状态; 尝试在成功匹配之前查询它的任何部分将导致抛出IllegalStateException
。 匹配器的显式状态由每个匹配操作重新计算。
匹配器的隐含状态包括输入字符序列以及附加位置 ,其最初为零并且由appendReplacement
方法更新。
匹配器可以通过调用其reset()
方法显式重置,或者如果需要新的输入序列,则可以重新匹配其reset(CharSequence)
方法。 重置匹配器会丢弃其显式状态信息,并将追加位置设置为零。
此类的实例不能安全地被多个并发线程使用。
Modifier and Type | Method and Description |
---|---|
Matcher |
appendReplacement(StringBuffer sb, String replacement)
实施非终端附加和替换步骤。
|
StringBuffer |
appendTail(StringBuffer sb)
实施终端附加和替换步骤。
|
int |
end()
返回最后一个字符匹配后的偏移量。
|
int |
end(int group)
返回在上次匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。
|
int |
end(String name)
返回给定捕获子序列的最后一个字符之后的偏移量
named-capturing group以前的匹配操作期间。
|
boolean |
find()
尝试找到匹配模式的输入序列的下一个子序列。
|
boolean |
find(int start)
重新设置该匹配器,然后尝试从指定的索引开始找到匹配模式的输入序列的下一个子序列。
|
String |
group()
返回与上一个匹配匹配的输入子序列。
|
String |
group(int group)
返回在上一次匹配操作期间由给定组捕获的输入子序列。
|
String |
group(String name)
返回给定捕获的输入子序列
named-capturing group以前的匹配操作期间。
|
int |
groupCount()
返回此匹配器模式中捕获组的数量。
|
boolean |
hasAnchoringBounds()
查询该匹配器的区域边界的锚定。
|
boolean |
hasTransparentBounds()
查询此匹配器的区域边界的透明度。
|
boolean |
hitEnd()
如果在匹配器执行的最后一次匹配操作中输入的结尾被搜索引擎命中,则返回true。
|
boolean |
lookingAt()
尝试将输入序列从区域开头开始与模式相匹配。
|
boolean |
matches()
尝试将整个区域与模式进行匹配。
|
Pattern |
pattern()
返回该匹配器解释的模式。
|
static String |
quoteReplacement(String s)
返回一个文字替换
String 为指定的
String 。
|
Matcher |
region(int start, int end)
设置该匹配器区域的限制。
|
int |
regionEnd()
报告该匹配器区域的最终索引(排他)。
|
int |
regionStart()
报告该匹配器区域的开始索引。
|
String |
replaceAll(String replacement)
将与模式匹配的输入序列的每个子序列替换为给定的替换字符串。
|
String |
replaceFirst(String replacement)
将与模式匹配的输入序列的第一个子序列替换为给定的替换字符串。
|
boolean |
requireEnd()
如果更多输入可以将正匹配更改为否定,则返回true。
|
Matcher |
reset()
重设此匹配器。
|
Matcher |
reset(CharSequence input)
使用新的输入序列重置此匹配器。
|
int |
start()
返回上一个匹配的起始索引。
|
int |
start(int group)
返回给定组在上一个匹配操作期间捕获的子序列的开始索引。
|
int |
start(String name)
返回给定捕获的子序列的初始索引
named-capturing group以前的匹配操作期间。
|
MatchResult |
toMatchResult()
返回此匹配器的匹配状态为 MatchResult 。
|
String |
toString()
返回此匹配器的字符串表示形式。
|
Matcher |
useAnchoringBounds(boolean b)
设置该匹配器的区域边界的锚定。
|
Matcher |
usePattern(Pattern newPattern)
更改,这
Matcher用于查找与匹配的
Pattern。
|
Matcher |
useTransparentBounds(boolean b)
设置此匹配器的区域边界的透明度。
|
public Pattern pattern()
public MatchResult toMatchResult()
MatchResult
。
结果不受在此匹配器上执行的后续操作的影响。
MatchResult
与这个匹配器的状态
public Matcher usePattern(Pattern newPattern)
此方法会导致此匹配器丢失有关发生的最后一个匹配的组的信息。 匹配器在输入中的位置得到维护,其最后一个附加位置不受影响。
newPattern
- 该匹配器使用的新模式
IllegalArgumentException
- 如果newPattern是
null
public Matcher reset()
重置匹配器会丢弃其所有的显式状态信息,并将其附加位置设置为零。 匹配器的区域设置为默认区域,它是其整个字符序列。 该匹配器区域边界的锚定和透明度不受影响。
public Matcher reset(CharSequence input)
重置匹配器会丢弃其所有的显式状态信息,并将其附加位置设置为零。 匹配器的区域设置为默认区域,它是其整个字符序列。 该匹配器区域边界的锚定和透明度不受影响。
input
- 新的输入字符序列
public int start()
start
在界面
MatchResult
IllegalStateException
- 如果尚未尝试匹配,或者前一匹配操作失败
public int start(int group)
Capturing groups从左到右索引,从一开始。 组零表示整个模式,所以表达式m。 start(0)相当于m。 start() 。
start
在接口
MatchResult
group
- 此匹配器模式中捕获组的索引
IllegalStateException
- 如果尚未尝试匹配,或者前一个匹配操作失败
IndexOutOfBoundsException
- 如果在给定索引的模式中没有捕获组
public int start(String name)
name
- 此匹配器模式中的命名捕获组的名称
-1
如果匹配成功,但组本身不匹配任何东西
IllegalStateException
- 如果尚未尝试匹配,或者前一匹配操作失败
IllegalArgumentException
- 如果在给定名称的模式中没有捕获组
public int end()
end
中的
MatchResult
IllegalStateException
- 如果尚未尝试匹配,或者前一匹配操作失败
public int end(int group)
Capturing groups从左到右索引,从一开始。 组零表示整个模式,所以表达式m。 end(0)相当于m。 end() 。
end
在接口
MatchResult
group
- 此匹配器模式中捕获组的索引
IllegalStateException
- 如果尚未尝试匹配,或者前一个匹配操作失败
IndexOutOfBoundsException
- 如果在给定索引的模式中没有捕获组
public int end(String name)
name
- 此匹配器模式中的命名捕获组的名称
-1
如果匹配成功但组本身没有匹配
IllegalStateException
- 如果尚未尝试匹配,或者前一匹配操作失败
IllegalArgumentException
- 如果在给定名称的模式中没有捕获组
public String group()
对于具有输入序列s的匹配器m ,表达式m。 group()和s。 substring( m。 start(), m。 end())是等效的。
请注意,某些模式,例如a* ,匹配空字符串。 当模式成功匹配输入中的空字符串时,此方法将返回空字符串。
group
在接口
MatchResult
IllegalStateException
- 如果尚未尝试匹配,或者前一个匹配操作失败
public String group(int group)
对于匹配器m ,输入序列s和组索引g ,表达式m。 group( g )和s。 substring( m。 start( g ), m。 end( g ))是等效的。
Capturing groups从左到右索引,从一开始。 组零表示整个模式,因此表达式m.group(0)相当于m.group() 。
如果匹配成功,但指定的组失败,则匹配输入序列的任何部分,则返回null 。 请注意,某些组(例如(a*) )与空字符串匹配。 当这样的组成功匹配输入中的空字符串时,此方法将返回空字符串。
group
在接口
MatchResult
group
- 此匹配器模式中捕获组的索引
IllegalStateException
- 如果尚未尝试匹配,或者前一个匹配操作失败
IndexOutOfBoundsException
- 如果在给定索引的模式中没有捕获组
public String group(String name)
如果匹配成功,但是指定的组不符合输入序列的任何部分,则返回null 。 请注意,某些组(例如(a*) )与空字符串匹配。 当这样的组成功匹配输入中的空字符串时,此方法将返回空字符串。
name
- 此匹配器模式中的命名捕获组的名称
IllegalStateException
- 如果尚未尝试匹配,或者前一个匹配操作失败
IllegalArgumentException
- 如果在给定名称的模式中没有捕获组
public int groupCount()
组零表示按照惯例的整个模式。 它不包括在这个计数。
任何小于或等于此方法返回值的非负整数将被保证为此匹配器的有效组索引。
groupCount
中的
MatchResult
public boolean matches()
如果匹配成功可以通过start,end和group方法来获得,然后更多的信息。
public boolean find()
该方法从该匹配器区域的开始处开始,或者如果该方法的先前调用成功,并且匹配器尚未被重置,则在与之前匹配不匹配的第一个字符处。
如果匹配成功可以通过start,end和group方法来获得,然后更多的信息。
public boolean find(int start)
如果匹配成功可以通过start,end和group方法,以及随后的调用能够得到那么更多的信息find()
方法将在不受此匹配匹配的第一个字符开始。
start
- 开始搜索匹配的索引
IndexOutOfBoundsException
- 如果start小于零,或者start大于输入序列的长度。
public boolean lookingAt()
像matches
方法一样,这种方法总是从该区域的开头开始; 不同于该方法,它不要求整个区域匹配。
如果匹配成功可以通过start,end和group方法来获得,然后更多的信息。
public static String quoteReplacement(String s)
String
指定的String
。
该方法产生一个String
,可以在Matcher
类的appendReplacement
方法中作为文字替换s
。
该String
产生将匹配的字符序列s
作为文字序列处理。
斜杠(''')和美元符号('$')将没有特殊意义。
s
- 要被字面化的字符串
public Matcher appendReplacement(StringBuffer sb, String replacement)
此方法执行以下操作:
它从输入序列读取字符,从附加位置开始,并将它们附加到给定的字符串缓冲区。 在读取上一个匹配之前的最后一个字符,即索引号 start()
- 1的 字符后 停止 。
它将给定的替换字符串附加到字符串缓冲区。
它将该匹配器的追加位置设置为匹配的最后一个字符的索引,加上一个,即end()
。
替换字符串可能包含对上一次匹配期间捕获的子序列的引用 :每次出现的${ 名称 }或$ g将分别由相应的group(name)
或group(g)
的评估结果代替。 对于$克 ,所述$后的第一个数字始终被视为该组参考的一部分。 如果他们将组成法律团体参考,则将后续数字并入g。 只有数字“0”到“9”被认为是组参考的潜在组件。 例如,如果第二组匹配字符串"foo" ,则传递替换字符串"$2bar"将导致"foobar"被附加到字符串缓冲器。 一个美元符号( $ )可以作为替代字符串中的文字包含在前面加反斜杠( \$ )。
请注意,替换字符串中的反斜杠( \ )和美元符号( $ )可能会导致结果与被视为文字替换字符串时的结果不同。 如上所述,美元符号可被视为对捕获子序列的引用,反斜杠用于转义替换字符串中的文字字符。
该方法旨在与循环一起使用appendTail
和find
方法。 例如,以下代码将one dog two dogs in the yard写入标准输出流:
Pattern p = Pattern.compile("cat"); Matcher m = p.matcher("one cat two cats in the yard"); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, "dog"); } m.appendTail(sb); System.out.println(sb.toString());
sb
- 目标字符串缓冲区
replacement
- 替换字符串
IllegalStateException
- 如果尚未尝试匹配,或者前一匹配操作失败
IllegalArgumentException
- 如果替换字符串是指在模式中不存在的命名捕获组
IndexOutOfBoundsException
- 如果替换字符串是指在模式中不存在的捕获组
public StringBuffer appendTail(StringBuffer sb)
此方法从输入序列读取字符,从追加位置开始,并将其附加到给定的字符串缓冲区。 旨在在appendReplacement
方法的一个或多个调用之后调用,以便复制输入序列的其余部分。
sb
- 目标字符串缓冲区
public String replaceAll(String replacement)
该方法首先重置此匹配器。 然后扫描输入序列,查找模式的匹配。 不属于任何匹配的字符将直接追加到结果字符串中; 每个匹配在替换字符串的结果中被替换。 替换字符串可能包含对appendReplacement
方法中捕获的子序列的引用 。
请注意,替换字符串中的反斜杠( \ )和美元符号( $ )可能会导致结果与将其视为文字替换字符串时的结果不同。 如上所述,美元符号可被视为对捕获子序列的引用,反斜杠用于转义替换字符串中的文字字符。
给定正则表达式a*b ,输入"aabfooaabfooabfoob"和替换字符串"-" ,在该表达式的匹配器上调用此方法将产生字符串"-foo-foo-foo-" 。
调用此方法会更改此匹配器的状态。 如果匹配器要用于进一步的匹配操作,那么应该首先被重置。
replacement
- 替换字符串
public String replaceFirst(String replacement)
该方法首先重置此匹配器。 然后扫描输入序列寻找模式的匹配。 不属于匹配的字符将直接附加到结果字符串中; 匹配在结果中被替换字符串替换。 替换字符串可能包含对appendReplacement
方法中捕获的子序列的引用 。
请注意,替换字符串中的反斜杠( \ )和美元符号( $ )可能会导致结果与被视为文字替换字符串时的结果不同。 如上所述,美元符号可被视为对捕获子序列的引用,反斜杠用于转义替换字符串中的文字字符。
给定正则表达式dog ,输入"zzzdogzzzdogzzz"和替换字符串"cat" ,在该表达式的匹配器上调用此方法将产生字符串"zzzcatzzzdogzzz" 。
调用此方法会更改此匹配器的状态。 如果匹配器要用于进一步的匹配操作,那么应该首先被重置。
replacement
- 替换字符串
public Matcher region(int start, int end)
start
由指定的索引在参数和结束end
参数。
取决于所使用的透明度和锚定(参见useTransparentBounds
和useAnchoringBounds
),某些构造例如锚点可能在该区域的边界处或周围具有不同的表现。
start
- 开始搜索的索引(含)
end
- 结束搜索的索引(独占)
IndexOutOfBoundsException
- 如果start或end小于零,如果start大于输入序列的长度,如果end大于输入序列的长度,或者start大于end。
public int regionStart()
regionStart
(含)和regionEnd
(排他性)中的匹配项。
public int regionEnd()
regionStart
(含)和regionEnd
(独家)中找到匹配项。
public boolean hasTransparentBounds()
如果此匹配器使用透明边界false(如果它使用不透明边界),则此方法返回true 。
有关透明和不透明边界的说明,请参阅useTransparentBounds
。
默认情况下,匹配器使用不透明区域边界。
useTransparentBounds(boolean)
public Matcher useTransparentBounds(boolean b)
使用参数true调用此方法将设置此匹配器以使用透明边界。 如果布尔参数为false ,则将使用不透明边界。
使用透明边界,该匹配器区域的边界对于lookahead,lookbehind和边界匹配结构是透明的。 那些结构可以超越该地区的边界,看看匹配是否合适。
使用不透明边界,该匹配器区域的边界对于可能尝试超越它们的lookahead,lookbehind和边界匹配结构是不透明的。 这些构造不能超越边界,因此它们将无法匹配该区域之外的任何内容。
默认情况下,匹配器使用不透明边界。
b
- 指示是否使用不透明或透明区域的布尔值
hasTransparentBounds()
public boolean hasAnchoringBounds()
如果该匹配器使用锚定边界,则此方法返回true , 否则为 false。
有关锚定界限的说明,请参阅useAnchoringBounds
。
默认情况下,匹配器使用锚定区域边界。
useAnchoringBounds(boolean)
public Matcher useAnchoringBounds(boolean b)
使用参数true调用此方法将设置此匹配器以使用锚定边界。 如果布尔参数为false ,则将使用非锚定边界。
使用锚定边界,该匹配器区域的边界匹配诸如^和$之类的锚点。
没有锚定边界,该匹配器区域的边界将不匹配诸如^和$之类的锚点。
默认情况下,匹配器使用锚定区域边界。
b
- 一个布尔值,表示是否使用固定边界。
hasAnchoringBounds()
public String toString()
返回此匹配器的字符串表示形式。 Matcher的字符串表示Matcher
包含可能对调试有用的信息。 确切的格式是未指定的。
public boolean hitEnd()
如果在匹配器执行的最后一次匹配操作中输入的结尾被搜索引擎命中,则返回true。
当此方法返回true时,可能更多的输入会改变上一次搜索的结果。
public boolean requireEnd()
如果更多输入可以将正匹配更改为否定,则返回true。
如果此方法返回true,并且找到匹配,则更多的输入可能会导致匹配丢失。 如果此方法返回false并找到匹配,则更多输入可能会更改匹配,但匹配不会丢失。 如果没有找到匹配项,那么requireEnd就没有意义了。