将区间表示法解析为 Guava Range

2024-04-06

我需要将包含标准间隔表示法(即 (8,100)、[6,10) 等)的字符串解析为 Guava Range 对象。我将如何在 Java 中做到这一点?是否有一个实用程序包可以将字符串解析为构建 Guava Range 对象所需的组件?


如果我们看一下这个模式,间隔要么以'[' or a '(',然后后面至少跟一个数字,再跟一个逗号,再跟一个或多个数字,最后以任一数字结尾']' or ')'.

所以正则表达式将如下所示:

^[\\(|\\[](\\d+),(\\d+)[\\)|\\]]$

这里是分解的:

^
 [\\(|\\[] -> start either with `'['` or `'('` (we need to escape the special characters with `\\`)
 (\\d+) -> followed by one or more digit that we capture in a group
 , -> followed by a comma
 (\\d+) -> followed again by one or more digit that we capture in another group
 [\\)|\\]] -> and that finishes either with `']'` or `')'`
$

^ and $断言所有字符串都与表达式匹配,而不仅仅是其中的一部分。

所以我们有了正则表达式,耶!

现在我们需要创建一个Pattern从中获取实例,以便能够从中获取匹配器。最后我们检查字符串是否与模式匹配并获取相应的组

Pattern p = Pattern.compile("^[\\(|\\[](\\d+),(\\d+)[\\)|\\]]$");
Matcher m = p.matcher("(0,100)");

if(matcher.matches()) {
    int lowerBound = Integer.parseInt(matcher.group(1));
    int upperBound = Integer.parseInt(matcher.group(2));
    System.out.println(lowerBound + "_" + upperBound);
}

以下输出0_100.

现在是最后一步,获取第一个和最后一个字符并从中创建适当的范围;把它们放在一起:

class RangeFactory {

    private static final Pattern p = Pattern.compile("^[\\(|\\[](\\d+),(\\d+)[\\)|\\]]$");

    public static Range from(String range) {
        Matcher m = p.matcher(range);
        if(m.matches()) {
            int length = range.length();

            int lowerBound = Integer.parseInt(m.group(1));
            int upperBound = Integer.parseInt(m.group(2));

            if(range.charAt(0) == '(') {
                if(range.charAt(length - 1) == ')') {
                    return Range.open(lowerBound, upperBound);
                }
                return Range.openClosed(lowerBound, upperBound);
            } else {
                if(range.charAt(length - 1) == ')') {
                    return Range.closedOpen(lowerBound, upperBound);
                }
                return Range.closed(lowerBound, upperBound);
            }
        }
        throw new IllegalArgumentException("Range " + range + " is not valid.");
    }
}

这是一些测试用例:

List<String> ranges =
    Arrays.asList("(0,100)", "[0,100]", "[0,100)", "(0,100]", "", "()", "(0,100", "[,100]", "[100]");

for(String range : ranges) {
    try {
        System.out.println(RangeFactory.from(range));
    } catch (IllegalArgumentException ex) {
        System.out.println(ex);
    }
}

其输出:

(0‥100)
[0‥100]
[0‥100)
(0‥100]
java.lang.IllegalArgumentException: Range  is not valid.
java.lang.IllegalArgumentException: Range () is not valid.
java.lang.IllegalArgumentException: Range (0,100 is not valid.
java.lang.IllegalArgumentException: Range [,100] is not valid.
java.lang.IllegalArgumentException: Range [100] is not valid.

您可以改进正则表达式(以接受无限边界的范围等),但它应该为您提供一个良好的起点。

希望能帮助到你! :)

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

将区间表示法解析为 Guava Range 的相关文章

随机推荐

  • 如何在 Go 中验证电子邮件地址

    我检查了 StackOverflow 但找不到任何可以回答的问题如何用 Go 语言验证电子邮件 经过一番研究 我根据自己的需要找出并解决了这个问题 我有这个regex and 转函数 效果很好 import fmt regexp func
  • jquery如何向图像添加图钉并将位置保存到SQL

    如何固定图像并保存固定位置 I found 这个插件 http jsfiddle net uKkRh 1 但我不知道如何保存这些引脚的位置 这个想法就像谷歌地图一样 用户可以在其中放置任意数量的图钉 并将这些图钉位置保存到数据库中 下次登录
  • 如何从命令行列出 Github 包注册表存储库中的所有包?

    假设我们有 Github 包注册表存储库https maven pkg github com someOrganization https maven pkg github com someOrganization 如何将此存储库中的所有包
  • 加快随机森林速度的建议

    我正在做一些工作randomForest包 虽然效果很好 但可能很耗时 有人对加快速度有什么建议吗 我使用的是带有双核 AMD 芯片的 Windows 7 盒子 我知道 R 不是多线程 处理器 但很好奇是否有任何并行包 rmpi snow
  • 如何更改 Gstreamer 插件的等级?

    我已经下载并编译了 vaapi 插件集 对于某些特定情况它工作得很好 但它也破坏了我现有的许多管道 我想先修改 Gstreamer 以使用其他解码器 有没有办法在不修改原始源的情况下改变 Gstreamer 插件的等级 我在 Gstream
  • JSF 2.0 中的显式 url 重定向

    我下面有以下两页 你好 xhtml 由 hello jsf url 呈现
  • 访问 MS Access 应用程序中的原始代码

    我一直在尝试查找一些有关访问 MS Access 中的原始代码的信息 我使用 v2007 但可能应该适用于所有版本 举例来说 我想列出应用程序中每个代码隐藏表单和模块中的所有函数并列出它们的参数 你将如何实现这一目标 注意 我当然假设该应用
  • 如何使用 jq 过滤 JSON 对象数组?

    我有以下 JSON 输入 zk kafka InstanceType t2 medium zkMemory 16 kafkaMemory 8 InstanceType t2 small zkMemory 8 kafkaMemory 4 es
  • 限制 ADFS 2.0 使用特定 OU 而不是域级别访问

    考虑以下示例场景 我有一个用于生产 测试 和开发的单个 Active Directory 域 每个域在 OU 级别分开 我想在测试 OU 级别安装 ADFS 并且不希望在测试 OU ADFS 上经过身份验证的用户能够访问 读取和写入 其他
  • jQuery 简单值与 .val() 出现问题

    我有以下代码 document ready function alert font someClass val 这里有一个Fiddle http jsfiddle net 2wwzD 1 用它 有谁知道为什么我无法返回字体标签的值 我是否假
  • 求树的深度?

    我对二叉树和递归非常陌生 我的程序是找到树的高度 但我有点困惑为什么我的程序不起作用 struct Node int value Node left Node right int heightOfTree Node node if node
  • 当属性名称为参数时如何查询属性值?

    通常我们可以查询属性值 例如 Match n Product where n name iPhone X return n 但是 就我而言 我不知道应该匹配哪个属性 但我只知道值 在这种情况下属性名称就变成了一种变量 我想要这样的东西 Ma
  • 如何收到 wifi 网络状态变化的通知?

    我正在编写一个通过 wifi 连接到 telnet 服务器的应用程序 我有一个管理套接字连接的服务 一切正常 但当手机休眠时 它会断开 wifi 无线电 这会导致套接字连接中断 并抛出 SocketException 我觉得我应该能够设置一
  • 如何在 Windows 中使用命令提示符创建多个空文件

    我正在开发一个项目 需要创建多个空文件 过去 我使用过 touch 命令 但这只能让我一次创建一个文件 有没有办法在 Windows 中使用命令提示符创建多个空文件 我感谢您提出的任何建议或解决方案 谢谢你 A FOR循环将允许您创建任意数
  • alias_method 和 class_methods 不能混合使用吗?

    我一直在尝试修补全局缓存模块 但我不明白为什么这不起作用 有没有人有什么建议 这是错误 NameError undefined method get for module Cache from irb 21 in alias method
  • 使用 Dataset API 在 Tensorflow 中批量滑动窗口

    有没有办法修改一批图像的组成 目前 当我创建例如大小为 4 的批次 我的批次将如下所示 Batch1 Img0 Img1 Img2 Img3 第2批 Img4 Img5 Img6 Img7 我需要修改批次的组成 以便它只会转移到下一个图像一
  • 运行 .net 应用程序而不安装 .net 客户端配置文件?

    我在framework 4 0中构建了一个c net应用程序 我不反对为客户端的电脑安装 net 但是在客户端安装它太大了 这不可能有一些小的安装程序或redist包吗 安装并有助于轻松运行 net 应用程序 因为仅为小型应用程序安装完整的
  • 在 Go 中不睡眠的情况下测试异步结果

    我的代码中有相当多的组件具有持久的 go 例程 用于侦听事件以触发操作 大多数时候 他们没有理由 除了测试之外 在完成该操作后发回通知 但是 我的单元测试正在使用 sleep 来等待这些异步任务完成 Send notification ev
  • JUnit 4 与 TestNG - 更新 2013 - 2014 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 JUnit 4 和 TestNG 曾经具有可比性 这两个测试框架有何优缺点 我今天比较了 TestNG 和 JUnit4 以我有限的测试框架经验
  • 将区间表示法解析为 Guava Range

    我需要将包含标准间隔表示法 即 8 100 6 10 等 的字符串解析为 Guava Range 对象 我将如何在 Java 中做到这一点 是否有一个实用程序包可以将字符串解析为构建 Guava Range 对象所需的组件 如果我们看一下这