正则表达式在java中的使用,java中的正则表达式
目录
Java正则表达式包简单示例元字符元字符字符类或范围类联合类交集类减法类前言:
在正则表达式的世界里,有很多不同的风格可供选择,比如grep、Perl、Python、PHP、awk等等。这意味着在一种编程语言中有效的正则表达式在另一种编程语言中可能无效。Java中的正则表达式语法与Perl中的最相似。要在Java中使用正则表达式,我们不需要任何特殊的设置。JDK包含一个特殊的java包java.util.regex,它完全专用于regex。我们只需要将它导入到我们的代码中。此外,java.lang.String类还具有内置的正则表达式支持,这是我们在代码中常用的。
Java正则表达式包
java.util.regex包由三个类组成:Pattern、Matcher和PatternSyntaxException:
Pattern模式对象是一个编译过的正则表达式。Pattern类不提供公共构造函数。要创建一个模式,我们必须首先调用它的一个公共静态编译方法,然后返回一个模式对象。这些方法接受正则表达式作为第一个参数。Matcher解释模式并对输入字符串执行匹配操作。它也没有定义公共构造函数。我们通过调用模式对象上的Matcher方法来获取Matcher对象。PatternSyntaxException对象是一个未经检查的异常,它表明正则表达式模式中存在语法错误。我们必须先了解正则表达式在Java中是如何构造的。
如果您已经熟悉不同环境的正则表达式,您可能会发现一些差异,但它们是最小的。
00-1010让我们从正则表达式最简单的用例开始。如前所述,当正则表达式应用于一个字符串时,它可能匹配零次或多次。
java支持的最基本的模式匹配形式。java.util.regex正则表达式API是字符串文本的匹配。例如,如果正则表达式是foo,而输入字符串是foo,则匹配会成功,因为字符串是相同的:
@ test public void given text _ whenSimpleRegexMatches _ then correct(){ Pattern Pattern=Pattern.compile( foo );matcher matcher=pattern . matcher( foo );assert true(matcher . find());}我们首先创建一个模式对象,方法是调用它的静态编译方法,并将我们想要使用的模式传递给它。
然后我们创建一个Matcher对象,调用Pattern对象的Matcher方法,并将要检查匹配的文本传递给它。
之后,我们调用Matcher对象中的find方法。
find方法在输入文本中不断前进,并为每个匹配返回true,因此我们也可以使用它来查找匹配计数:
@ Testpublic void given text _ whenSimpleRegexMatchesTwice _ then correct(){ Pattern Pattern=Pattern.compile( foo );matcher matcher=pattern . matcher( foo foo );int matches=0;while(matcher . find()){ matches;} assertEquals(matches,2);}因为我们将运行更多的测试,所以我们可以在一个名为runTest的方法中抽象出查找匹配数量的逻辑:
public static int runTest(String regex,String text){ Pattern Pattern=Pattern.compile(regex);matcher matcher=pattern . matcher(text);int matches=0;while(matcher . find()){ matches;}返回匹配项;}当我们得到0个匹配时,测试应该失败,否则应该通过。
"maodian">
Meta Characters元字符
元字符会影响模式匹配的方式,从而为搜索模式添加逻辑。JavaAPI支持多个Meta Characters,最简单的是.
匹配任何字符:
@Testpublic void givenText_whenMatchesWithDotMetach_thenCorrect() { int matches = runTest(".", "foo"); assertTrue(matches > 0);}
考虑到前面的例子,其中regex-foo匹配文本foo和foo两次。如果我们在正则表达式中使用点元字符,那么在第二种情况下,我们不会得到两个匹配:
@Testpublic void givenRepeatedText_whenMatchesOnceWithDotMetach_thenCorrect() { int matches= runTest("foo.", "foofoo"); assertEquals(matches, 1);}
注意正则表达式中foo后面的点。匹配器匹配前面有foo的每个文本,因为最后一个点部分表示后面的任何字符。因此,在找到第一个foo之后,其余的被视为任何角色。这就是为什么只有一场比赛。
该API支持其他几个元字符<([{^-=$!]})?*+.>
我们将在本文中进一步探讨。
Character类
浏览官方模式类规范,我们将发现受支持的正则表达式构造的摘要。在Character类下,我们有大约6个结构。
OR
构造为[abc]。集合中的任何元素都是匹配的:
@Testpublic void givenORSet_whenMatchesAny_thenCorrect() { int matches = runTest("[abc]", "b"); assertEquals(matches, 1);}
如果它们都出现在文本中,则每一个单独匹配,不考虑顺序:
@Testpublic void givenORSet_whenMatchesAnyAndAll_thenCorrect() { int matches = runTest("[abc]", "cab"); assertEquals(matches, 3);}
它们也可以作为字符串的一部分进行替换。在下面的示例中,当我们通过将第一个字母与集合中的每个元素交替来创建不同的单词时,它们都是匹配的:
@Testpublic void givenORSet_whenMatchesAllCombinations_thenCorrect() { int matches = runTest("[bcr]at", "bat cat rat"); assertEquals(matches, 3);}
NOR
通过添加插入符号作为第一个元素来否定上述集合:
@Testpublic void givenNORSet_whenMatchesNon_thenCorrect() { int matches = runTest("[^abc]", "g"); assertTrue(matches > 0);}
另外一个例子:
@Testpublic void givenNORSet_whenMatchesAllExceptElements_thenCorrect() { int matches = runTest("[^bcr]at", "sat mat eat"); assertTrue(matches > 0);}
Range类
我们可以定义一个类,该类使用连字符(-)指定匹配文本应该落在的范围内,同样,我们也可以否定一个范围。
匹配大写字母:
@Testpublic void givenUpperCaseRange_whenMatchesUpperCase_ thenCorrect() { int matches = runTest( "[A-Z]", "Two Uppercase alphabets 34 overall"); assertEquals(matches, 2);}
匹配小写字母:
@Testpublic void givenLowerCaseRange_whenMatchesLowerCase_ thenCorrect() { int matches = runTest( "[a-z]", "Two Uppercase alphabets 34 overall"); assertEquals(matches, 26);}
匹配大小写字母:
@Testpublic void givenBothLowerAndUpperCaseRange_ whenMatchesAllLetters_thenCorrect() { int matches = runTest( "[a-zA-Z]", "Two Uppercase alphabets 34 overall"); assertEquals(matches, 28);}
匹配范围:
@Testpublic void givenNumberRange_whenMatchesAccurately_ thenCorrect() { int matches = runTest( "[1-5]", "Two Uppercase alphabets 34 overall"); assertEquals(matches, 2);}
匹配另外的数字范围:
@Testpublic void givenNumberRange_whenMatchesAccurately_ thenCorrect2(){ int matches = runTest( "[30-35]", "Two Uppercase alphabets 34 overall"); assertEquals(matches, 1);}
Union类
union字符类是两个或多个字符类组合的结果:
@Testpublic void givenTwoSets_whenMatchesUnion_thenCorrect() { int matches = runTest("[1-3[7-9]]", "123456789"); assertEquals(matches, 6);}
上述测试将只匹配9个整数中的6个,因为并集跳过4、5和6。
Intersection类
与union类类似,该类是在两个或多个集合之间拾取公共元素的结果。要应用交叉点,我们使用&&:
@Testpublic void givenTwoSets_whenMatchesIntersection_thenCorrect() { int matches = runTest("[1-6&&[3-9]]", "123456789"); assertEquals(matches, 4);}
我们得到4个匹配,因为两个集合的交集只有4个元素。
Subtraction类
我们可以使用减法对一个或多个字符类求反,例如匹配一组奇数十进制数:
@Testpublic void givenSetWithSubtraction_whenMatchesAccurately_thenCorrect() { int matches = runTest("[0-9&&[^2468]]", "123456789"); assertEquals(matches, 5);}
到此这篇关于Java正则表达式API系列详情的文章就介绍到这了,更多相关Java正则表达式 内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。