Java 正则表达式中的零长度匹配

2023-11-23

我的代码:

Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("ababa");
while(matcher.find()){
   System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}

输出 :

0[a]1
1[]1
2[a]3
3[]3
4[a]5
5[]5

我知道的 :

  • “A?”代表字符“a”出现零次或一次。

Java API 说:

  • matcher.start() 返回上一个匹配的开始索引。
  • matcher.end() 返回最后一个匹配字符之后的偏移量。
  • matcher.group() 返回与前一个匹配的输入子序列 匹配。对于具有输入序列 s 的匹配器 m,表达式 m.group() 和 s.substring(m.start(), m.end()) 是等效的。而对于 某些模式(例如 a*)与空字符串匹配。这个方法 当模式成功匹配时将返回空字符串 输入中的空字符串。

我想知道的是:

  1. 正则表达式引擎在哪些情况下会遇到零 给定字符的出现 - 此处为字符“a”。
  2. 在这种情况下,start() 实际返回的值是什么, 匹配器中的 end() 和 group() 方法。我已经提到过什么 java API 说。但说到实际我就不太清楚了 情况如上。

The ?是一个贪婪量词,因此它会首先尝试匹配 1 次出现,然后再尝试匹配 0 次出现。在你的字符串中,

  1. 它从第一个字符“a”开始,并尝试匹配 1 次出现。 'a' 字符匹配,因此它返回您看到的第一个结果
  2. 然后它向前移动并找到“b”。 “b”字符与正则表达式 1 次出现不匹配,因此引擎回溯并尝试匹配 0 次出现。结果是空字符串被匹配——>你得到第二个结果。
  3. 然后它会移到 b 之前,因为那里不可能再有匹配项,并且它会以第二个“a”字符重新开始。
  4. 等等...你明白了...

它比这更复杂一些,但这就是主要思想。当 1 次出现无法匹配时,它将尝试 0 次出现。

至于 start、end 和 group 的值,它们将是匹配开始、结束的位置,而组是已匹配的内容,因此在字符串的第一个 0 出现匹配中,您将得到 1、1 和空字符串。我不确定这是否真的回答了你的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 正则表达式中的零长度匹配 的相关文章

  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 正则表达式匹配bash变量

    我正在尝试修改 bash 脚本 当前脚本包含 print div class 1 div Where 1可能看起来像 Apprentice Historian Level 1 Historian Level 4 Master Histori
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 如何匹配 R 中的所有匹配项?

    我有 1000 个名字的列表 说A 我还有另外 5 个名字的清单 说B 我想找出这5个名字出现在1000个号码列表中的第几行 例如 Amy 在 A 中可以出现 25 次 B 里有艾米 我想知道 Amy 出现在 A 中的哪些行 我以前使用过
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 替换字符串/文本中“从第 n 次到最后一次”出现的单词

    这个问题以前曾被问过 但尚未得到令提问者满意的答案 https stackoverflow com questions 36368712 how to use stringrs replace all function to replace
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 将 checkstyle/google_checks.xml 与 maven-checkstyle-plugin 一起使用时出错

    我正在尝试使用检查样式 google checks xml with maven checkstyle 插件 如果我将 google checks xml 与最新的 checkstyle intelliJ 插件一起使用 一切都是正确的 但是
  • 如何正确地将 numpy 数组传递给 Cython 函数?

    这在很多地方都有描述 但我根本无法让它发挥作用 我正在从 Cython 调用 C 函数 cimport numpy as np cdef extern from test h namespace mytest void test doubl
  • 自定义wpf中切换按钮的切换状态

    我想自定义 wpf 中切换按钮的切换状态 我想在切换按钮打开时将图像设置为切换按钮 并在关闭时设置另一个图像 为此 我想到使用触发器 这就是我最终所做的
  • NSDataDetector 检测“电话号码”文本

    我解释这个问题的最简单方法是使用代码示例及其输出 但本质上发生的是NSDataDetector正在检测包含单词 phone number 的字符串中的电话号码 NSError error nil NSDataDetector dataDet
  • 使用 tweepy 从 twitter 流 api 中排除转发

    使用Python时tweepy从 Twitter 的流 API 中提取推文的库是否可以排除转发 例如 如果我只想要特定用户 ex 发布的推文 twitterStream filter follow 20264932 但这会返回转发 我想排除
  • 如何为运行时依赖添加Import-Package指令?

    我正在使用 Gradle 构建 OSGi jar 但在清单方面遇到了一些问题 这是我的构建脚本的摘录 apply plugin java apply plugin osgi jar baseName awesome manifest nam
  • 臃肿的 EXE 大小以及与 Qt/MingW 的不必要的依赖关系

    我试图弄清楚如何缩小在最新的 QT SDK 4 8 2 基于 mingw g 下编译的 EXE 文件的大小 我当时正在开发一个普通的 C 控制台应用程序 它有一个简单的循环 并且只有 includes iostream 当我注意到它生成的
  • NLog 使用 NLog.config 动态更改文件名

    如何使用 C 中的变量动态更改文件名 我的想法是创建一个日志文件 例如Log
  • Dataframe Apply 方法返回多个元素(系列)

    import pandas as pd 假设我有一个dataframe像这样 df pd DataFrame a range 4 b range 1 5 它看起来像这样 a b 0 0 1 1 1 2 2 2 3 3 3 4 以及一个将 X
  • 如何让 bc(1) 打印前导零?

    我在 Makefile 中执行类似以下操作 echo 0 1 0 1 bc 当然 在真实文件中 数字是动态的 它打印 2但我想打印它0 2 我想这样做而不诉诸于sed但我似乎找不到如何获得bc打印零 或者是bc只是无法做到这一点 您还可以使
  • 如何通过TCL分割字符串并存储在列表中

    有没有办法分割字符串并保存在列表中 如何拆分字符串并保存在两个列表中 例如 我有一个字符串 我用它分割了几个字符串 a 1 b 2 c 3 d 4 然后我想创建两个这样的列表 a b c d and 1 2 3 4 以下是简单的tcl代码
  • 比较图像以找出差异

    任务 我在装配线的末端安装了一个摄像头 捕获生产物品的图像 举例来说 我们 制作门票 上面有一些文字和图片 所以每 生成的票据被拍照并作为图像保存到磁盘 现在我 想要检查这些保存的图像是否存在异常 即比较 将它们转换为图像 模板 这可以 所
  • 在Matlab中使像素透明

    我已经在 matlab 中导入了图像 在显示它之前如何使图像的背景透明 例如 我在白色背景上有一个红色球 如何使图像的白色像素透明 以便只有红色球可见 白色像素透明 您需要确保图像以 png 格式保存 然后您可以使用 阿尔法 参数png 文
  • Kotlin 多平台:访问代码中的构建变量

    我正在开发一个 Kotlin 多平台项目 该项目是一个为 iOS 和 Android 应用程序提供功能的 SDK In our build gradle kts我们希望在 iOS 和 Android 之间的公共代码共享代码中访问几个变量 作
  • bash:rsync,选项作为变量

    我正在编写 bash 脚本 该脚本在某些部分将通过 ssh 同步文件 不幸的是 我面临着将 rsync 选项保持为变量的问题 请看下面 variables directory etc backupDirectory backup incre
  • 即使我没有对项目进行任何更改,为什么我的数据库项目的 .dbmdl 文件也会发生变化?

    我遇到了一个小而奇怪的烦恼 似乎也发生在其他人身上 例如 查看SEDE的修订历史 我在 Visual Studio 2010 中有一个可以正常工作的 SQL Server 2008 数据库项目 当我提交 签入源代码管理时 我被告知我的数据库
  • Symfony2:自定义错误页面扩展base.html.twig

    我正在尝试自定义 Symfony 中的错误页面 这是我的error html twig文件位于app Resources TwigBundle views Exception extends base html twig block bod
  • Google GCM 服务器返回未经授权的错误 401

    我正在使用 GCM 服务从服务器推送信息 如果我使用浏览器键 它会显示成功消息 multicast id 4849013215736515938 成功 1 失败 0 canonical ids 0 结果 message id 0 13487
  • 将 NULL 插入具有默认值的 NOT NULL 列

    对于一些背景知识 我们使用Zend 框架 2 and Doctrine在上班 教义总是会插入NULL对于我们自己不填充的价值观 通常这是可以的 因为如果该字段有默认值 那么它应该使用该默认值填充该字段 对于我们正在运行的服务器之一MySQL
  • Java 正则表达式中的零长度匹配

    我的代码 Pattern pattern Pattern compile a Matcher matcher pattern matcher ababa while matcher find System out println match