Pattern.DOTALL
默认情况下,当我们使用“.”时表达式中,我们将匹配输入字符串中的每个字符,直到遇到新行字符。
使用此标志,匹配也将包括行终止符。我们将通过以下示例更好地理解。这些例子将略有不同。由于我们感兴趣的是针对匹配的字符串进行断言,因此我们将使用matcher的group方法来返回之前的匹配。
首先,我们将看到默认行为:
@Test
public void givenRegexWithLineTerminator_whenMatchFails_thenCorrect() {
Pattern pattern = Pattern.compile("(.*)");
Matcher matcher = pattern.matcher(
"this is a text" + System.getProperty("line.separator")
+ " continued on another line");
matcher.find();
assertEquals("this is a text", matcher.group(1));
}
正如我们所看到的,只有行终止符之前输入的第一部分匹配。
现在在dotall模式下,包括行终止符在内的整个文本都将匹配:
@Test
public void givenRegexWithLineTerminator_whenMatchesWithDotall_thenCorrect() {
Pattern pattern = Pattern.compile("(.*)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(
"this is a text" + System.getProperty("line.separator")
+ " continued on another line");
matcher.find();
assertEquals(
"this is a text" + System.getProperty("line.separator")
+ " continued on another line", matcher.group(1));
}
我们还可以使用嵌入的标志表达式来启用dotall模式:
@Test
public void givenRegexWithLineTerminator_whenMatchesWithEmbeddedDotall
_thenCorrect() {
Pattern pattern = Pattern.compile("(?s)(.*)");
Matcher matcher = pattern.matcher(
"this is a text" + System.getProperty("line.separator")
+ " continued on another line");
matcher.find();
assertEquals(
"this is a text" + System.getProperty("line.separator")
+ " continued on another line", matcher.group(1));
}
Pattern.LITERAL
在此模式下,matcher对任何元字符、转义字符或正则表达式语法都没有特殊意义。如果没有此标志,匹配器将根据任何输入字符串匹配以下正则表达式:
@Test
public void givenRegex_whenMatchesWithoutLiteralFlag_thenCorrect() {
int matches = runTest("(.*)", "text");
assertTrue(matches > 0);
}
这是我们在所有示例中看到的默认行为。但是,使用此标志时,将找不到匹配项,因为匹配器将查找(.*)
,而不是解释它:
@Test
public void givenRegex_whenMatchFailsWithLiteralFlag_thenCorrect() {
int matches = runTest("(.*)", "text", Pattern.LITERAL);
assertFalse(matches > 0);
}
现在,如果我们添加所需的字符串,测试将通过:
@Test
public void givenRegex_whenMatchesWithLiteralFlag_thenCorrect() {
int matches = runTest("(.*)", "text(.*)", Pattern.LITERAL);
assertTrue(matches > 0);
}
没有用于启用文字分析的嵌入标志字符。
Pattern.MULTILINE
默认情况下,^
和$
元字符分别在整个输入字符串的开头和结尾绝对匹配。匹配器忽略任何行终止符:
@Test
public void givenRegex_whenMatchFailsWithoutMultilineFlag_thenCorrect() {
int matches = runTest(
"dog$", "This is a dog" + System.getProperty("line.separator")
+ "this is a fox");
assertFalse(matches > 0);
}
匹配失败,因为匹配器在整个字符串的末尾搜索dog
,但狗出现在字符串第一行的末尾。
然而,有了这个标志,同样的测试也会通过,因为匹配器现在考虑了行终止符。因此,字符串dog
正好在行终止之前找到,因此成功:
@Test
public void givenRegex_whenMatchesWithMultilineFlag_thenCorrect() {
int matches = runTest(
"dog$", "This is a dog" + System.getProperty("line.separator")
+ "this is a fox", Pattern.MULTILINE);
assertTrue(matches > 0);
}
以下是嵌入式标志版本:
@Test
public void givenRegex_whenMatchesWithEmbeddedMultilineFlag_
thenCorrect() {
int matches = runTest(
"(?m)dog$", "This is a dog" + System.getProperty("line.separator")
+ "this is a fox");
assertTrue(matches > 0);
}
Matcher类方法
在本节中,我们将研究Matcher
类的一些有用方法。为了清晰起见,我们将根据功能对它们进行分组。
索引方法
索引方法提供有用的索引值,精确显示在输入字符串中找到匹配项的位置。在下面的测试中,我们将确认输入字符串中dog
匹配的开始和结束索引:
@Test
public void givenMatch_whenGetsIndices_thenCorrect() {
Pattern pattern = Pattern.compile("dog");
Matcher matcher = pattern.matcher("This dog is mine");
matcher.find();
assertEquals(5, matcher.start());
assertEquals(8, matcher.end());
}
Study方法
Study方法遍历输入字符串并返回一个布尔值,指示是否找到该模式。常用的是matches
和lookingAt
方法。
matches
和lookingAt
方法都试图根据模式匹配输入序列。不同之处在于,匹配需要匹配整个输入序列,而lookingAt
则不需要。
这两种方法都从输入字符串的开头开始:
@Test
public void whenStudyMethodsWork_thenCorrect() {
Pattern pattern = Pattern.compile("dog");
Matcher matcher = pattern.matcher("dogs are friendly");
assertTrue(matcher.lookingAt());
assertFalse(matcher.matches());
}
matches
方法将在如下情况下返回true
:
@Test
public void whenMatchesStudyMethodWorks_thenCorrect() {
Pattern pattern = Pattern.compile("dog");
Matcher matcher = pattern.matcher("dog");
assertTrue(matcher.matches());
}
Replacement方法
Replacement方法可用于替换输入字符串中的文本。常见的是replaceFirst
和replaceAll
。
replaceFirst
和replaceAll
方法替换与给定正则表达式匹配的文本。正如其名称所示,replaceFirst
替换第一个引用,replaceAll
替换所有引用:
@Test
public void whenReplaceFirstWorks_thenCorrect() {
Pattern pattern = Pattern.compile("dog");
Matcher matcher = pattern.matcher(
"dogs are domestic animals, dogs are friendly");
String newStr = matcher.replaceFirst("cat");
assertEquals(
"cats are domestic animals, dogs are friendly", newStr);
}
替换所有引用:
@Test
public void whenReplaceAllWorks_thenCorrect() {
Pattern pattern = Pattern.compile("dog");
Matcher matcher = pattern.matcher(
"dogs are domestic animals, dogs are friendly");
String newStr = matcher.replaceAll("cat");
assertEquals("cats are domestic animals, cats are friendly", newStr);
}
replaceAll
方法允许我们用相同的替换替换所有匹配项。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2671.html
暂无评论