Java 中的字符串拆分:可变长度的前向和后向

2024-04-27

我想使用数字作为分隔符来破坏 Java 中的字符串,但保留数字。一些研究表明,使用 String 中的 split method() 是合适的,但我不明白如何做到这一点。为了进一步解释我的问题,我将使用一个例子:

Input: 20.55|50|0.5|20|20.55

Required Output: ["20.55","|","50","|","0.5","|","20","|","20.55"]

通过调用 split 方法(如下面的示例所示),无需前向和后向,我得到了预期的输出

expression.split("([0-9]+(\\.[0-9]+)?)")

Output: ["|","|","|","|"]

但如果我尝试通过前瞻来做到这一点:

expression.split("(?=([0-9]+(\\.[0-9]+)?))")

Output: ["2","0.","5","5|","5","0|","0.","5|","2","0|","2","0.","5","5"]    

通过使用lookbehind,我得到一个异常:

线程“main”中的异常java.util.regex.PatternSyntaxException: 后视组在索引附近没有明显的最大长度 22 (?

谁能向我解释这种行为并提出解决方案?

PS:我知道我可以使用“|”打破字符串,但这只是一个愚蠢的例子,我实际上需要一个更复杂的正则表达式......

EDIT:

由于分隔符的长度,似乎不可能做我想做的事。由于我正在寻找一个较小问题的解决方案,然后我可以将其用于练习的其余部分,因此我将重新措辞以查看是否有转机,就像第二个和第三个答案中发现的那样:

我想在Java中打破一个包含算术表达式的字符串,并保留它的所有项目。例如:

Input: 20.55 * 0.5 ** cos(360) + sin 0 * cos 90 + 1 * sin (180 + 90) * 0
Output: ["20.55", "*", "0.5", "**", "cos", "(", "360", ")", "+", "sin", "0", "*", "cos", "90", "+", "1", "*", "sin", "(", "180", "+", "90", ")", "*", "0"] 

PSS:请注意,我必须使用“**”来求幂。

EDIT 2根据anubhava给出的答案,找到了一个解决方案,可以打破其所有项目的算术表达式

Pattern p = Pattern.compile( "\\*\\*|sin|cos|tan|\\d+(?:\\.\\d+)?|[-()+*/%]" );
Matcher matcher = p.matcher(expression);

while(matcher.find())
    System.out.println(matcher.group());

您可以使用基于环视的正则表达式进行拆分:

String[] toks = "20.55|50|0.5|20|20.55".split( "(?=[^\\d.])|(?<=[^\\d.])" );

for (String tok: toks)
    System.out.printf("%s%n", tok);

正则表达式演示 https://regex101.com/r/nY7qW1/5


Update:

您可以使用此正则表达式matching您的代币:

Pattern p = Pattern.compile( "sin|cos|tan|\\d+(?:\\.\d+)?|[-()+*/%]" );

然后您可以使用Matcher#find()while 循环中的方法来获取所有匹配的标记。

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

Java 中的字符串拆分:可变长度的前向和后向 的相关文章

随机推荐

  • 转换多索引时间序列的最有效方法

    我有一个由许多堆叠时间序列组成的 DataFrame 索引为 poolId Month 其中两者都是整数 月 是自 2000 年以来的月数 计算多个变量的一个月滞后版本的最佳方法是什么 现在 我做了类似的事情 cols to shift b
  • 按主题更改 ActionBar 的高度

    我想删除 ActionBar 下面的阴影 我知道我需要将高度更改为 0dp 但我想在主题中执行此操作 对于 Android 4 4 我使用
  • 您如何使用(描述的)技术来处理 .Net 中的 C 结构和指针?

    你如何使用这里描述的技术 https stackoverflow com questions 3235916 a way how to compile c library into net dll 3236027 3236027使用 Net
  • 在DOS中创建带有echo的文件而不插入回车符

    我想在 DOS 中的 CIFS 挂载上创建一个新文件 如果我做 echo hello gt foo txt hello 的末尾会有一个 CR 如何使用 echo 在 DOS cmd 中创建文件而不自动附加 CR 它导致 samba 和我的
  • 什么时候可以将函数绑定到另一个名称?

    在解释器中工作时 将函数绑定到名称通常很方便 例如 ghci gt let f 1 ghci gt f 1 2 这是别名f到函数 1 简单的 然而 这并不总是有效 我发现导致错误的一个例子是尝试使用别名nub来自Data List模块 例如
  • 在 IntelliJ 中创建新包

    我刚刚从使用 Eclipse 多年转向 IntelliJ 的美丽新世界 我正在努力解决那些拖慢我速度的小事情 当你知道如何去做时 最新的希望是显而易见的 我在源文件夹下创建一个新包 uk ac cam admin 我右键单击这个新包来创建另
  • 将仅限 HTTPS 的自定义域正确分配给 flex env

    将自定义域映射到 Google App Engine 项目的正确方法是什么 我已经添加了自定义域 设置了所有 DNS 记录等 并且它正在工作 但如何仅强制执行 HTTPS 就像生成的自定义域一样 从阅读周围many我看过的帖子secure
  • 当非特权用户运行 C/asm 程序时,会对 Linux 造成什么危害?

    我一直在考虑一种场景 让用户 可以是任何人 可能有恶意 提交在 Linux PC 我们称之为基准节点 上运行的代码 目标是为单线程例程创建一种自动化基准测试环境 假设一个网站向代理发布了一些代码 该代理将此代码交给基准节点 而基准节点仅与代
  • postgres union 是否保证调用有副作用的函数时的执行顺序?

    我正在使用 postgres 9 3 并尝试确保从 sql 语句调用时按顺序调用存储过程 以下操作是否有效 确保首先调用 foo 然后调用 bar select null void from select 1 from foo union
  • curl:(7)无法连接到192.168.99.100端口31591:连接被拒绝

    这些是我的豆荚 hello kubernetes 5569fb7d8f 4rkhs 0 1 ImagePullBackOff 0 5d2h hello minikube 5857d96c67 44kfg 1 1 Running 1 5d2h
  • “char *_EXFUN(index,(const char *, int));”的含义

    我发现这是 eclipse idexer intelisence 的一个命题 无论它叫什么 就是这样 char EXFUN index const char int 首先 它看起来像一个返回 char 指针的函数 但参数 如果它是一个函数
  • 使用 M1 在 dockerized Linux 上安装节点画布

    我有以下Dockerfile我在 MacBook Air M1 上运行 所以在 docker 中我有带有 M1 的 linux FROM node 16 7 0 WORKDIR work CMD while true do sleep 10
  • Spirit qi 解析为嵌套函数的抽象语法树

    我正在尝试使用 boost 的spirit qi 解析器创建一个解析器 它正在解析包含三种类型值的字符串 常量 变量或函数 这些函数可以相互嵌套 测试字符串是f a b f g z x g x h x c where a e是常数 f r是
  • 如何获得修改任何参数的函数?

    我的目标 我必须创建一个将两个分数相加的函数 我定义了一个新的struct typedef 称为fraction 该函数不能有返回类型fraction 它一定要是void 因此它必须修改输入的参数之一 我该如何实现这一点 也许是指点 您将如
  • 从状态栏中删除通知图标

    我在状态栏中显示一个图标 现在我想在打开该内容时立即删除该图标 一段时间后如果我们收到任何警报 该图标将再次显示 我怎样才能做到这一点 使用NotificationManager取消您的通知 您只需提供您的通知 ID https devel
  • 将一个表的所有行复制到另一个表

    我有两个数据库MySQL and SQL Server 我想在其中创建表SQL Server并复制表中的所有行MySQL到新表中SQL Server 我可以在中创建表SQL Server与 一样MySQL 使用以下代码 List
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • 选择从查询中检索列名称的列

    我正在寻找一种优雅的方法来从表 A 中选择列 其中列名是从表 B 上的查询中检索的 对表 B 的查询结果 col01 表 A 有几个名为 col01 col02 col03 最终查询应该是为了结果 result from B effecti
  • 根据区域设置获取货币 ISO 4217 代码

    假设我用以下命令解析 HTTP Accept Language 标头Locale acceptFromHttp http www php net manual en locale acceptfromhttp php是否有一种简单可靠的方法
  • Java 中的字符串拆分:可变长度的前向和后向

    我想使用数字作为分隔符来破坏 Java 中的字符串 但保留数字 一些研究表明 使用 String 中的 split method 是合适的 但我不明白如何做到这一点 为了进一步解释我的问题 我将使用一个例子 Input 20 55 50 0