捕获具有同一组的 和 (thisPartOnly)

2023-12-30

假设我们有以下输入:

<amy>
(bob)
<carol)
(dean>

我们还有以下正则表达式:

<(\w+)>|\((\w+)\)

现在我们得到两场比赛(如 rubular.com 上所示 http://www.rubular.com/r/nfwk7d5YRG):

  • <amy>是一场比赛,\1捕获amy, \2 fails
  • (bob)是一场比赛,\2捕获bob, \1 fails

这个正则表达式完成了我们想要的大部分功能,它们是:

  • 它正确匹配左括号和右括号(即没有混合)
  • 它捕获了我们感兴趣的部分

然而,它确实有一些缺点:

  • The capturing pattern (i.e. the "main" part) is repeated
    • It's only \w+ in this case, but generally speaking this can be quite complex,
      • 如果涉及反向引用,那么必须为每个替代项重新编号!
      • 重复使维护成为一场噩梦! (如果改变怎么办?)
  • The groups are essentially duplicated
    • Depending on which alternate matches, we must query different groups
      • 这只是\1 or \2在这种情况下,但通常“主要”部分可以有自己的捕获组!
    • 这不仅不方便,而且在某些情况下这是不可行的(例如,当我们使用仅限于查询一组的自定义正则表达式框架时)
  • 如果我们也想匹配的话情况很快就会恶化{...}, [...], etc.

那么问题就很明显了:我们怎样才能在不重复“主要”模式的情况下做到这一点?

注意:大多数情况下我感兴趣java.util.regex口味,但欢迎其他口味。


Appendix

本节没有什么新内容;它只是用一个例子来说明上面提到的问题。

让我们将上面的示例带到下一步:我们现在要匹配这些:

<amy=amy>
(bob=bob)
[carol=carol]

但不是这些:

<amy=amy)   # non-matching bracket
<amy=bob>   # left hand side not equal to right hand side

使用替代技术,我们可以得到以下有效的方法(如 rubular.com 上所示 http://www.rubular.com/r/ojoknCda2A):

<((\w+)=\2)>|\(((\w+)=\4)\)|\[((\w+)=\6)\]

如上所述:

  • 主要模式不能简单地重复;反向引用必须重新编号
  • 如果发生变化,重复也意味着维护噩梦
  • 根据备用匹配项,我们必须查询\1 \2, \3 \4, or \5 \6

在进行真正的匹配之前,您可以使用前瞻来“锁定”组编号。

String s = "<amy=amy>(bob=bob)[carol=carol]";
Pattern p = Pattern.compile(
  "(?=[<(\\[]((\\w+)=\\2))(?:<\\1>|\\(\\1\\)|\\[\\1\\])");
Matcher m = p.matcher(s);

while(m.find())
{
  System.out.printf("found %s in %s%n", m.group(2), m.group());
}

output:

found amy in <amy=amy>
found bob in (bob=bob)
found carol in [carol=carol]

它仍然很难看,但是您不必每次进行更改时都重新计算所有组编号。例如,要添加对大括号的支持,只需:

"(?=[<(\\[{]((\\w+)=\\2))(?:<\\1>|\\(\\1\\)|\\[\\1\\]|\\{\\1\\})"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获具有同一组的 和 (thisPartOnly) 的相关文章

  • Java 流 - 按嵌套列表分组(按第二顺序列出)

    我有以下数据结构 每个学生都有一个州列表 每个州都有一个城市列表 public class Student private int id private String name private List
  • Glassfish:在部署期间修改 EAR 的部署描述符

    经过几天的搜索 尝试和摇头 我将这个问题发布到 SO 尽管它seems已经得到答复 这是场景 我有一个 EAR 应用程序 目前 包含一个 WAR 和一个 EJB 模块 EJB 模块使用 JPA persistence xml 并且一些无状态
  • 如何将抽象工厂与单例模式结合起来? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 java 编码 并且对这些模式很陌生 谁能给我一个也使用单例的工厂抽象的例子 这是一个实现类的示例单例模式 这个实现也是线程安全
  • 如何为java注释处理器编写自动化单元测试?

    我正在尝试使用 java 注释处理器 我可以使用 JavaCompiler 编写集成测试 事实上我现在正在使用 hickory 我可以运行编译过程并分析输出 问题 即使我的注释处理器中没有任何代码 单个测试也会运行大约半秒 对于以 TDD
  • 全静态方法和应用单例模式有什么区别?

    我正在创建一个数据库来存储有关我的网站用户的信息 我正在使用 stuts2 因此使用 Java EE 技术 对于数据库 我将创建一个 DBManager 我应该在这里应用单例模式还是将其所有方法设为静态 我将使用这个 DBManager 进
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • net.sf.jasperreports.engine.JRRuntimeException:java.io.IOException:无法读取字体数据

    我正在尝试通过 JasperReport 创建 PDF 报告 但读取字体数据时出现问题 我有 jasperreports extension properties 和 ClassPath 中的相关 TTF 文件 这是错误 java io I
  • 在R中提取其他两个字符串之间的字符串

    我试图找到一种简单的方法来提取出现在两个已知子字符串之间的未知子字符串 可以是任何内容 例如 我有一个字符串 a lt anything goes here STR1 GET ME STR2 anything goes here 我需要提取
  • spring mvc 跟踪引用页面

    在基于注释的弹簧控制器中 如果用户正在url com first page并点击一个链接或提交一份表格指出url com second page 如何制作second page知道url of first page所以这样second pa
  • 忽略正则表达式匹配的嵌套括号内的逗号

    我有以下正则表达式 s s g这允许我匹配由逗号分隔的元素 同时忽略内部的逗号 有这个 a b c aaa bbb ccc d 我明白了 a b c aaa bbb ccc d 现在 我想升级它以考虑另一个级别的括号 我不想考虑任何级别 我
  • selenium webdriver 中的多个程序执行不起作用

    Selenium WebDriver 中的多个程序执行不起作用 我编写了 1 个 testNG xml 文件和 2 个 java 类 我尝试从 xml 文件运行这两个 java 类 但这不起作用 XML代码
  • “___ 中的方法 ___() 是在无法访问的类或接口中定义的”编译错误

    我发现了一个奇怪的编译限制 我无法解释 并且我不明白这个限制的原因 示例1 考虑这些类 In package e1 public class C1 enum E1 A B C public E1 x In package e2 import
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • while 之后无法访问的语句[重复]

    这个问题在这里已经有答案了 我只是修改代码 在以下代码中出现错误 int x 1 System out println x x while true x System out println x x 错误在最后一行 我可以知道错误 错误 无
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • 使正则表达式以惰性方式匹配,同时跳过一些单词

    我想要正则表达式 其中包括跳过一些单词以惰性方式匹配 例如 正则表达式 all s S 0 10 s Damages amount s S 0 10 s in s excess s of 示例文本 第 8 1 a 条规定的所有此类损害超出免
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • 导入错误:没有名为“paramiko”的模块

    我已经在这里完成了网上的其他问题 我觉得我的问题足够不同 值得提出一个新问题 所以我有一个Centos 6 box 它正在为我运行一个小网站 充当办公室 git 服务器 我正在尝试配置Python3 on it 所以我遵循以下这些步骤 ht
  • 不支持 Android 身份验证方案 ntlm

    我使用 asynchttpClient 进行基本身份验证 http loopj com android async http http loopj com android async http 那是 loj lib 下面是我的代码 用户名随
  • 数组中的元素太多!

    抱歉 如果这是一个菜鸟问题 一段C代码 int array 5 int cnt for cnt 0 cnt lt 10 cnt 1 array cnt cnt 应该会报错吧 不 工作正常 但这是为什么呢 看起来 在第一行 定义了一个大于双倍
  • Firebase 功能:在 stackdriver 控制台中使用 Winston 进行日志记录

    我无法使winston https github com winstonjs winston记录器写入日志堆栈驱动程序 https cloud google com logging 安慰 我将我的函数部署为 google firebase
  • 如何修复本机客户端错误“连接正忙于处理另一个命令的结果”?

    我得到了一个Connection Busy With Results From Another Command当 SSIS 包运行时 来自 SQL Server Native Client 驱动程序的错误 仅当与 SQLServer 200
  • Libgdx Scene2d - 设置演员( TextField )填充?

    我在设置填充或类似于演员的东西时遇到了麻烦 找不到路 我想我可能必须在皮肤中添加一些东西 我有这个文本字段 textboxskin new Skin textboxskin add textfieldback new Texture dat
  • 如何在android中使用XML布局在图像视图中为图像制作圆角

    我已经尝试了很多次 但我知道我错过了一些东西 你们能解释一下吗 以下是我尝试过的
  • 对象是空的吗? [复制]

    这个问题在这里已经有答案了 检查对象是否为空的最快方法是什么 有没有比这更快更好的方法 function count obj obj var i 0 for var key in obj i return i 对于 ECMAScript5
  • 避免非虚拟析构函数的对象切片

    我正在为智能指针编写代码作为练习 使用在线教程 1 http www davethehat com articles smartp htm 2 http www codeproject com Articles 15351 Implemen
  • 你能在 mdbg 中看到评估堆栈吗?

    假设我有以下 CIL ldc i4 40 lt a breakpoint is set here ldc i4 2 add box int32 call void mscorlib System Console WriteLine stri
  • 使用 Android 提交至 Google 电子表格表单

    第一次在这里提问 通常我不用问就能找到答案 但这一次我陷入了困境 无法弄清楚我错过了什么 我只是想让我的 Android 应用程序在网站上填写表格并提交 我不需要应用程序对发回的任何数据执行任何操作 只需填写表格并提交即可 基本上我正在尝试
  • Dalvik JIT 工作流程

    我对 dalvik vm Android 感兴趣 我试图通过 JIT 的代码来找出它执行的操作以及它如何选择跟踪 我无法遵循代码 因此 我请求所有人帮助我建议 JIT 中执行跟踪选择和翻译的相关函数 你可以尝试 git log grep J
  • 调用命令行程序的Web应用程序框架

    我们正在设计一个 Java EE Web 应用程序 在 tomcat 上运行 它旨在成为命令行程序的网络界面 是否有任何框架 应用程序允许这样做 即 JSP 页面将在内部向安装在与 Tomcat 服务器相同的服务器上的程序发出命令 命令行是
  • 左连接和左外连接的区别

    我想知道mySQL中的LEFT JOIN和LEFT OUTER JOIN是否有什么区别 如果没有区别那为什么会有两种不同的方式呢 提前致谢 它们是相同的 我认为您想要放入 外部 的唯一原因是为了清楚起见 为了澄清联接中的第一个表不需要它在第
  • extjs 面板适合布局

    我有一个面板 我正在将它渲染到一个容器中 我想要panel以适应containerheight 并且不想指定高度panel 但似乎不起作用 有什么办法可以做到吗 代码片段 div style width 100 height 100 div
  • 将 CellRendererToggle 的单行设置为不一致

    在 Gtk 3 上 我使用的是TreeModel存储嵌套信息并用 a 显示它CellRendererText and a CellRendererToggle 用户可以单击每个切换按钮 当存在嵌套按钮并且它们不处于相同状态时 我希望上层按钮
  • React 暴露组件函数

    基于此链接上的示例http reactjs cn react tips expose component functions html http reactjs cn react tips expose component function
  • 带有列表项的 GWT 无序列表

    我完全坚持在 gwt 中创建 css 驱动的菜单 在渲染的结果中 它应该看起来完全像这样 div class topbar div class container fixed h3 a href class logo test a h3 u
  • 制作Python批处理文件

    如何创建一个bat文件来运行python文件 特别是包含pygame bat文件 Simple 只需将以下内容作为批处理文件的第一行 python x 0 goto eof 批处理文件的其余部分是 Python 程序 这是一个完整的例子 p
  • 捕获具有同一组的 和 (thisPartOnly)

    假设我们有以下输入