iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Java中使用正则表达式API
  • 503
分享到

怎么在Java中使用正则表达式API

2023-07-02 08:07:21 503人浏览 安东尼
摘要

本文小编为大家详细介绍“怎么在Java中使用正则表达式api”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Java中使用正则表达式API”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言:在正则表达式的世

本文小编为大家详细介绍“怎么在Java中使用正则表达式api”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Java中使用正则表达式API”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

前言:

在正则表达式的世界中,有许多不同的风格可供选择,比如grep、Perl、pythonPHP、awk等等。这意味着在一种编程语言中工作的正则表达式可能在另一种编程语言中不工作。Java中的正则表达式语法与Perl中的最相似。要在Java中使用正则表达式,我们不需要任何特殊设置。jdk包含一个特殊的java包java.util.regex完全致力于regex。我们只需要将其导入到我们的代码中。此外,java.lang.String类还具有我们在代码中常用的内置正则表达式支持。

Java正则表达式包

 java.util.regex包由三个类组成:PatternMatcherPatternSyntaxException

  • Pattern模式对象是一个已编译的正则表达式。Pattern类不提供公共构造函数。要创建一个模式,我们必须首先调用它的一个公共静态编译方法,然后该方法将返回一个模式对象。这些方法接受正则表达式作为第一个参数。

  • Matcher对象解释模式并对输入字符串执行匹配操作。它也没有定义公共构造函数。我们通过调用模式对象上的Matcher方法来获得Matcher对象。

  • PatternSyntaxException对象是一个未经检查的异常,它指示正则表达式模式中的语法错误。

我们必须首先了解正则表达式是如何在Java中构造的。

如果你已经从不同的环境中熟悉了正则表达式,你可能会发现某些差异,但它们是最小的。

简单的例子

让我们从正则表达式的最简单用例开始。如前所述,当正则表达式应用于字符串时,它可能会匹配零次或多次。

java支持的最基本的模式匹配形式。java.util.regex正则表达式API是字符串文本的匹配。例如,如果正则表达式为foo,输入字符串为foo,则匹配将成功,因为字符串相同:

@Testpublic void givenText_whenSimpleRegexMatches_thenCorrect() {    Pattern pattern = Pattern.compile("foo");    Matcher matcher = pattern.matcher("foo");     assertTrue(matcher.find());}

我们首先通过调用其静态编译方法并向其传递我们想要使用的模式来创建一个Pattern对象。

然后我们创建一个Matcher对象,调用Pattern对象的Matcher方法,并将要检查匹配的文本传递给它。

之后,我们在Matcher对象中调用find方法。

find方法在输入文本中不断前进,并为每个匹配返回true,因此我们也可以使用它来查找匹配计数:

@Testpublic void givenText_whenSimpleRegexMatchesTwice_thenCorrect() {    Pattern pattern = Pattern.compile("foo");    Matcher matcher = pattern.matcher("foofoo");    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++;    }    return matches;}

当我们得到0个匹配项时,测试应该失败,否则应该通过。

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”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在Java中使用正则表达式API

本文链接: https://www.lsjlt.com/news/340567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作