Java:匹配字符串中的短语

2024-01-06

我在数据库和输入字符串中有一个短语列表(短语可能由一个或多个单词组成)。我需要找出哪些短语出现在输入字符串中。

在Java中是否有一种有效的方法来执行这种匹配?


一个快速的破解方法是:

  1. 基于组合短语构建正则表达式
  2. 构造一个集合,列出迄今为止尚未匹配的短语
  3. 反复运行find直到找到所有短语或到达输入末尾,从要查找的剩余短语集中删除匹配项

这样,无论您提供多少个短语,输入都只会遍历一次。如果正则表达式编译器为多个替代方案生成有效的匹配器,那么这应该会产生不错的性能。然而,这在很大程度上取决于您的短语和输入字符串,以及 Java 正则表达式引擎的质量。

示例代码(已测试,但未针对性能进行优化或分析):

public static boolean hasAllPhrasesInInput(List<String> phrases, String input) {
    Set<String> phrasesToFind = new HashSet<String>();
    StringBuilder sb = new StringBuilder();
    for (String phrase : phrases) {
        if (sb.length() > 0) {
            sb.append('|');
        }
        sb.append(Pattern.quote(phrase));
        phrasesToFind.add(phrase.toLowerCase());
    }
    Pattern pattern = Pattern.compile(sb.toString(), Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        phrasesToFind.remove(matcher.group().toLowerCase());
        if (phrasesToFind.isEmpty()) {
            return true;
        }
    }
    return false;
}

一些注意事项:

  • 上面的代码将匹配短语作为单词的子串。如果仅匹配完整的单词,则需要将单词边界(“\b”)添加到生成的正则表达式中。
  • 如果某些短语可能是其他短语的子串,则必须修改代码。
  • 如果需要匹配非 ASCII 文本,则应添加 regexp 选项Pattern.UNICODE_CASE并打电话toLowerCase(Locale)代替toLowerCase(),使用合适的Locale.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:匹配字符串中的短语 的相关文章

  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • C++:显式调用模板参数的 typedef 的析构函数

    我有以下内容 template
  • 自发布以来 PHP 计算时间

    我正在尝试创建一个新闻源 作为其中的一部分 我想向用户显示自新闻文章发布以来已经过去了多长时间 看起来像这样 发布时间 1分5秒前 然而我从我的功能中得到的只是这样 40年零11个月前 这就是我发送给函数的时间戳 该函数计算出自发布以来的时
  • 如何找到位置,emacs lisp函数绑定到键的位置?

    I m trying to figure out where M m is bound to back to indentation function When I issue C h k M m describe key I get th
  • 如何获取 WPF 列表框中选中的项目?

    我有一个 WPF 列表框 其中有复选框 但是如何获取已选中的项目列表 ListBox 是数据绑定到Dictionary
  • 函数参数中的“this”

    查看一些代码示例HtmlHelpers 我看到如下声明 public static string HelperName this HtmlHelper htmlHelper more regular params 我不记得在其他地方看到过这
  • ggplot2 facet_grid() strip_text_x() 基于因子的不同颜色

    有没有办法给名称着色或去除背景 不是实际网格的背景 正如这篇文章中所回答的那样 使用facet grid 有条件地更改面板背景 https stackoverflow com questions 9847559 conditionally
  • 为什么后台线程中未处理的异常不会导致应用程序域崩溃?

    我完全困惑了 我确信如果线程中存在未捕获的异常 NET 会关闭整个应用程序域 因此我从未对此进行过测试 但是我只是尝试了以下代码并且它没有失败 有人可以解释为什么吗 在 NET 4和3 5中尝试过 static void Main stri
  • 带参数的别名

    是否有可能使用 zsh 别名中的参数 像这样的事情 alias ssh nokia ssh root
  • ndb 和一致性:为什么在没有父级的查询中发生这种行为

    我正在使用 Python 和 ndb 做一些工作 但不明白为什么 我将发布上面的案例和代码 模型 py class Reference ndb Model kind ndb StringProperty required True crea
  • 混合单选按钮和文本字段

    我正在尝试将单选按钮和 text field 组合为单个值 f radio button system bacteria Bacteria f radio button system mammalian Mammalian f radio
  • overpass-api 方式查询包含坐标

    我正在尝试查询特定区域的酒店 不幸的是 我需要查询节点和路 因为有些酒店仅存储为路 有些则存储为节点 http overpass osm rambler ru cgi interpreter data 28way tourism hotel
  • Azure Web App 上的 URL 重写提供程序

    我们使用来自的 DbProviderURL 重写扩展性示例 http www iis net learn extensions url rewrite module using custom rewrite providers with u
  • 在 Neo4j 中查找集群

    你好 我有一个 neo4j 数据库 类似于下面 CREATE Person name Ryan TRADES gt fish Product name Fish ken Person name Ken TRADES gt fish mary
  • 如何取消绑定() .hover() 但不取消绑定.click()?

    我正在使用 Bootstrap 3 创建一个网站 并且还使用一个脚本 使用 hover 函数使下拉菜单出现在悬停时 我试图通过使用 enquire js 在小型设备上防止这种情况 我正在尝试使用以下代码取消绑定元素上的 hover 事件 d
  • 使用远程 Web 测试框架(BrowserStack 和 LambdaTest)时,chrome 上的表单输入条目失败 [重复]

    这个问题在这里已经有答案了 我的测试套件在本地以及使用 Chrome 的 gitlab 管道中运行良好 然而 当在远程测试框架上使用 Chrome 仅 运行它们时 它们会在登录页面上失败 我测试了 BrowserStack 和 LamdaT
  • 为什么声明浮点变量时需要在十进制数末尾添加“f”?

    我以前见过这个问题 然而 我对给出的答案并不满意 典型的响应是 Java 将数字视为双精度数 因为这是 JAVA 中的默认值 并在编译时给出不匹配错误 这种行为显然完全忽略了我对 float 声明的使用 我的问题是 如果我将变量类型声明为f
  • IIS 网络错误 (tcp_error)

    我在使用 IIS 时遇到问题 我在服务器上部署了一个Web项目 然后在该服务器上 本地 运行 就可以了 但是当我从另一台计算机连接时 我收到此消息 网络错误 tcp error 发生通信错误 操作超时 Web 服务器可能已关闭 太忙或遇到其
  • 以编程方式从布局中删除块

    我想根据通过前端路由器控制器登录的用户从产品视图页面中删除product options wrapper块 我知道我可以以编程方式附加一个新块 但我没有找到删除函数 尝试过某事 像那样 this gt getLayout gt unsetB
  • ES6 从 root 导入

    我目前正在玩 React Native 我正在尝试构建我的应用程序 但是它开始因导入而变得混乱 app components Loading js index ios js 现在 在我的index ios js我能够简单地做 import
  • Java:匹配字符串中的短语

    我在数据库和输入字符串中有一个短语列表 短语可能由一个或多个单词组成 我需要找出哪些短语出现在输入字符串中 在Java中是否有一种有效的方法来执行这种匹配 一个快速的破解方法是 基于组合短语构建正则表达式 构造一个集合 列出迄今为止尚未匹配