匹配方括号内的内容,包括嵌套方括号

2023-12-11

我正在尝试编写一个剧透识别系统,以便将字符串中的任何剧透都替换为指定的剧透字符。

我想匹配一个用方括号括起来的字符串,这样方括号内的内容就是捕获组1,并且包括括号在内的整个字符串就是匹配项。

我目前正在使用\[(.*?]*)\],对这个答案中的表达式稍作修改here,因为我也希望嵌套方括号成为捕获组 1 的一部分。

该表达式的问题在于,尽管它有效并匹配以下内容:

  • Jim ate a [sandwich]火柴[sandwich] with sandwich作为第 1 组
  • Jim ate a [sandwich with [pickles and onions]]火柴[sandwich with [pickles and onions]] with sandwich with [pickles and onions]作为第 1 组
  • [[[[]火柴[[[[] with [[[作为第 1 组
  • []]]]火柴[]]]] with ]]]作为第 1 组

但是,如果我想匹配以下内容,它不会按预期工作:

  • Jim ate a [sandwich with [pickles] and [onions]] matches both:
    • [sandwich with [pickles] with sandwich with [pickles作为第 1 组
    • [onions]] with onions]作为第 1 组

我应该使用什么表达式才能匹配[sandwich with [pickles] and [onions]] with sandwich with [pickles] and [onions]作为第 1 组?

EDIT:

由于在Java中使用正则表达式似乎不可能实现这一点,是否有替代解决方案?

EDIT 2:

我还希望能够按找到的每个匹配项分割字符串,因此正则表达式的替代方案将更难实现,因为String.split(regex)方便。这是一个例子:

  • Jim ate a [sandwich] with [pickles] and [dried [onions]] matches all:
    • [sandwich] with sandwich作为第 1 组
    • [pickles] with pickles作为第 1 组
    • [dried [onions]] with dried [onions]作为第 1 组

分割句子应该是这样的:

Jim ate a
with
and

更直接的解决方案

这个解决方案将省略空子串或仅包含空格的子串

public static List<String> getStrsBetweenBalancedSubstrings(String s, Character markStart, Character markEnd) {
    List<String> subTreeList = new ArrayList<String>();
    int level = 0;
    int lastCloseBracket= 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
            if (c == markStart) {
                    level++;
                    if (level == 1 && i != 0 && i!=lastCloseBracket &&
                        !s.substring(lastCloseBracket, i).trim().isEmpty()) {
                            subTreeList.add(s.substring(lastCloseBracket, i).trim());
                }
            }
        } else if (c == markEnd) {
            if (level > 0) { 
                level--;
                lastCloseBracket = i+1;
            }
            }
    }
    if (lastCloseBracket != s.length() && !s.substring(lastCloseBracket).trim().isEmpty()) {
        subTreeList.add(s.substring(lastCloseBracket).trim());  
    }
    return subTreeList;
}

然后,将其用作

String input = "Jim ate a [sandwich][ooh] with [pickles] and [dried [onions]] and ] [an[other] match] and more here";
List<String> between_balanced =  getStrsBetweenBalancedSubstrings(input, '[', ']');
System.out.println("Result: " + between_balanced);
// => Result: [Jim ate a, with, and, and ], and more here]

原始答案(更复杂,显示了提取嵌套括号的方法)

您还可以提取平衡括号内的所有子字符串,然后用它们分割:

String input = "Jim ate a [sandwich] with [pickles] and [dried [onions]] and ] [an[other] match]";
List<String> balanced = getBalancedSubstrings(input, '[', ']', true);
System.out.println("Balanced ones: " + balanced);
List<String> rx_split = new ArrayList<String>();
for (String item : balanced) {
    rx_split.add("\\s*" + Pattern.quote(item) + "\\s*");
}
String rx = String.join("|", rx_split);
System.out.println("In-betweens: " + Arrays.toString(input.split(rx)));

这个函数会找到所有[]- 平衡子串:

public static List<String> getBalancedSubstrings(String s, Character markStart, 
                                     Character markEnd, Boolean includeMarkers) {
    List<String> subTreeList = new ArrayList<String>();
    int level = 0;
    int lastOpenBracket = -1;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == markStart) {
            level++;
            if (level == 1) {
                lastOpenBracket = (includeMarkers ? i : i + 1);
            }
        }
        else if (c == markEnd) {
            if (level == 1) {
                subTreeList.add(s.substring(lastOpenBracket, (includeMarkers ? i + 1 : i)));
            }
            if (level > 0) level--;
        }
    }
    return subTreeList;
}

See IDEONE演示

代码执行结果:

Balanced ones: ['[sandwich], [pickles], [dried [onions]]', '[an[other] match]']
In-betweens: ['Jim ate a', 'with', 'and', 'and ]']

学分:getBalancedSubstrings是基于彼得·默里·拉斯特的答案如何在Java正则表达式中分割这个“树状”字符串? post.

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

匹配方括号内的内容,包括嵌套方括号 的相关文章

  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • Java,顺序流在哪个线程中执行?

    在阅读有关流的文档时 我遇到了以下句子 attempting to access mutable state from behavioral parameters presents you with a bad choice if you
  • 垂直 ViewPager 中的动画

    我需要垂直制作这个动画ViewPager https www youtube com watch v wuE 4jjnp3g https www youtube com watch v wuE 4jjnp3g 这是我到目前为止所尝试的 vi
  • 如何将本机数据库运算符 (postgres ~) 与 JPA 标准生成器一起使用?

    我使用 JPA 2 0 标准构建以下查询 简化 select n from notif n where n message b la 我正在使用 postgresql 数据库 我真的需要 运算符 而不是像 我可以使用与 CriteriaBu
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • Maven WebApp META-INF context.xml

    我正在使用 Maven 3 并且尝试在 webapp 文件夹下添加 META INF 文件夹 所以我正在尝试执行以下操作 src main webapp META INF context xml WEB INF 下面是我的 POM 文件
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 如何避免Eclipse在将类名放在注释中时导入类,以便checkstyle稍后不会抱怨?

    有时我将类名放在方法或类的注释中只是为了引用 但是 Eclipse 会自动执行导入并在文件中留下导入语句 这会导致稍后出现 未使用的导入 检查样式错误 当我在注释中输入类名时 是否可以更改一些配置以避免 Eclipse 自动导入 人们不同意
  • Spring HATEOAS 和 HAL:更改 _embedded 中的数组名称

    我正在尝试使用 Spring HATEOAS 构建符合 HAL 的 REST API 经过一番摆弄后我终于开始工作了mostly正如预期的那样 示例 输出现在看起来像这样 links self href http localhost 808
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • 对对象集合进行排序[重复]

    这个问题在这里已经有答案了 如果我有一个简单的字符串列表 List
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 从 InputStream 中删除换行符

    我喜欢从一个文件中删除所有换行符 对于 n 和 r n java io InputStream 在读取文件时 相应的方法如下所示 param target linkplain File return linkplain InputStrea

随机推荐

  • 全文搜索 sql server 中输入错误的单词

    我们目前正在评估模糊搜索的一系列选项 我们的要求之一是匹配错误的单词 CRA1G 数字 1 的 OCR 必须与 CRAIG 匹配 sql server 中的全文搜索似乎很接近 但没有雪茄 除了 FORMSOF Inflectional CR
  • 如何在 php 中设置电子邮件正文的样式[重复]

    这个问题在这里已经有答案了 我想设计邮件正文的样式 我尝试过以下方法来设置邮件正文的样式 但所有这些都不起作用 1 使用外部样式表样式 css td padding 10px mail php table td td table 2 定义的
  • 左连接上的 CTE 性能缓慢

    我需要提供一份报告 显示表中的所有用户及其分数 并非该表上的所有用户都会有分数 因此在我的解决方案中 我首先使用一些 CTE 计算分数 然后在最终的 CTE 中 我提取完整的名册 并为没有实际分数的用户分配默认分数 虽然 CTE 并不太复杂
  • .Net 数据结构:ArrayList、List、HashTable、Dictionary、SortedList、SortedDictionary -- 速度、内存以及何时使用每种结构? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 NET 有很多复杂的数据结构 不幸的是 其中一些非常相似 我并不总是确定何时使用其中一个 何时使用另一个 我的大多数 C 和 VB 书籍都在一定程度上讨论了它们 但从未真正深入讨
  • 通过 WPF 中的代码隐藏访问资源

    我在窗口资源中定义了一个自定义集合 如下所示 在 Sketchflow 应用程序中 因此窗口实际上是一个 UserControl
  • 将DEAP(遗传算法库)与spark结合使用

    是否可以使用 DEAP http deap readthedocs io en master 与 Spark 集群来映射适应度评估函数 我想运行 GA 但适应度函数相当长 我计划将其分布在 Spark 集群上 你应该看看使用多个处理器DEA
  • Tkinter - 多个按钮的同一事件

    使用 Tkinter 我有很多按钮 我希望每次按下任何按钮时都会触发相同的回调函数 我怎样才能知道按下了哪个按钮 def call p1 Which Button was pressed pass for i in range 50 B1
  • 模拟 PDO 获取失败情况

    符合php文档 PDO方法fetch 返回值FALSE两者均未找到记录AND失败时 例如 当数据库访问出现问题时 假设我将 PHP 错误报告系统设置为在失败时抛出异常 PDO ATTR ERRMODE gt PDO ERRMODE EXCE
  • 如何彻底清除 Laravel 中的缓存?

    我运行这些命令 php artisan view clear php artisan route clear s php artisan cache clear php artisan config clear php artisan co
  • 如果有人“窃取”我的 Facebook App ID,他们会造成什么损害?

    我创建了一个 Facebook 应用程序 ID 并将站点 URL 设置为 localhost 以便在进行身份验证 通过客户端 JavaScript 后 我在开发应用程序时会被重定向到本地计算机 我很想知道此设置是否存在任何风险 特别是如果我
  • 警告:date_default_timezone_get():

    我已经研究了我能找到的所有答案 但没有运气让它发挥作用 当我尝试运行 symfony 时出现以下错误 警告 date default timezone get 依赖 系统的时区设置 你是required使用 date timezone 设置
  • 如何检查android数据库中的重复名称?

    我想从两个编辑文本中输入姓名和电话号码 我使用两个按钮保存并使用列表视图在模拟器中显示它 输入姓名后 当我单击 保存 按钮时如何检查我是否已经输入了相同的名字 我是 Android 新手 解释会非常有帮助 public void onCre
  • 将产品标签移至 WooCommerce 产品描述

    我需要将产品标签移至 WooCommerce 产品描述的底部 我在用 将自定义内容添加到 WooCommerce 产品描述中 答案代码确实有效 我在产品描述下方收到文本 这是描述中的最后一行 现在我想添加产品元信息 产品 SKU 和标签 但
  • 在 php 脚本中使用缓存

    我对 php 中的缓存感到困惑 我在我的 php 文件中创建了一个用于显示 2 到 500 的文件 现在我想使用缓存文件来存储数据并显示它 我的代码如下 现在我如何使用缓存文件来保存输出并进一步在浏览器中显示 如果还有其他方法可以在 php
  • 如何从 WC_Subscription 实例对象获取用户 ID

    我有两个功能需要帮助 我希望它们能够处理我的订阅任务 代码注释 是我想要弄清楚的 如果您有其他反馈 我也愿意接受 这用于完成初始订阅付款和订阅续订 function payment made subscription How do I ge
  • MySQL 似乎正在覆盖记录

    我在 MySQL 中有一个全新的表 可以这样描述 Team Match Auto Gear Kpa Climb 1721 1 3 5 5 1 5813 2 2 2 15 0
  • Node v8 垃圾收集器 :: 如何调试长标记-清除时间?

    我使用 trace gc 标志运行我的应用程序以尝试找到一些性能问题 嗯 看来我可能已经找到了 1288678 ms Mark sweep 498 8 549 0 gt 488 8 548 0 MB 4085 ms idle notific
  • 带有 IntelliJ 和 SBT 的自定义文件夹结构的 Uber jar

    我对云还很陌生SBT IntelliJ 所以试试我的运气IntelliJ SBT构建环境以在 dataproc 集群上部署我的 jar 这是我的项目结构的屏幕截图 代码非常简单 main 定义在 mytestmain 它调用定义在中的另一个
  • Java正则表达式查找单词的完全匹配

    我正在尝试在 Java 中构建一个正则表达式模式来查找单词的精确匹配 例如 这个词hot应该在前 3 个字符串中找到 但在第四个字符串中找不到 hot in here It s hot how hot is it email protect
  • 匹配方括号内的内容,包括嵌套方括号

    我正在尝试编写一个剧透识别系统 以便将字符串中的任何剧透都替换为指定的剧透字符 我想匹配一个用方括号括起来的字符串 这样方括号内的内容就是捕获组1 并且包括括号在内的整个字符串就是匹配项 我目前正在使用 对这个答案中的表达式稍作修改here