我正在编写一个正则表达式(如果这很重要的话,在Java中使用),它试图匹配$之后的数字(可以是浮点数)(允许在$和数字之间隔开),但前提是紧接在它前面的单词不是‘Lost’.

如果有多个可能的匹配项,则应返回第一个数字.

为简单起见,假设所有字符均为大写.

例如,在下面的句子中:"我为啤wine 支付了10.12美元",10.12将被匹配.对于"我在游戏中输了11.34美元"这句话,将不会有匹配.对于"我在比赛中输了11.34美元,花了10.12美元买啤wine ",10.12仍然是匹配的.

我想出的正则表达式是

.*?(?<!LOST )[$]\s*(?<NUMBER>[0-9]*[.]?[0-9]*).*

我的正则表达式通常工作得很好,尽管我想知道是否有更简单的方法来编写它/我是否遗漏了任何大小写.一个小问题是,如果Lost和$之间有1个以上的空格,我仍然不想匹配,但目前我的正则表达式将匹配.不幸的是,消极的回顾必须有固定的宽度.

澄清:为了澄清,我所说的"前面的词不是‘迷失’"的意思是,在‘$’之前不能有‘迷失\S*’.这意味着‘Lost$123’和‘Lost$123’都不应该与123匹配,但‘Lost!$123’可以匹配123.理由是货币不应该直接被Lost‘作用’;如果在Lost和$之间有除了S之外的任何东西,那么货币很可能不会被Lost直接‘作用’.

推荐答案

假设在"LOST"和美元符号之间可能有1到99个空格.我还假设数字有两位小数,并且没有逗号作为千位分隔符.然后,可以try 将字符串与正则表达式进行匹配

(?<!\bLOST\s{1,99})\$(?<NUMBER>(?:0|[1-9]\d*)\.\d{2})\b

如果有匹配,名为NUMBER的捕获组将包含利息的美元金额.

Demo

将光标悬停在链接处的正则表达式上,以获取该表达式的每个元素的说明.



另一种方法是try 匹配正则表达式

\bLOST\s+\$(?:0|[1-9]\d*)\.\d{2}\b|\$(?<NUMBER>(?:0|[1-9]\d*)\.\d{2})\b

Demo

在这种情况下,不要注意没有捕获的匹配;只关注那些捕获的匹配,在这种情况下,捕获组NUMBER将包含感兴趣的货币价值.这里

\bLOST\s+\$(?:0|[1-9]\d*)\.\d{2}\b

匹配但不捕获"Lost"后跟一个或多个空格和美元符号的值.有人可能会说,它吞噬了这样的子串.

Java相关问答推荐

获取拦截器内部的IP地址

JPackaged应用程序启动MSI调试,然后启动System. exit()

为什么Java中的两个日期有差异?

最小拓Flutter 排序的时间复杂度是多少?

Java Stream,需要更新列表对象列表

如何粘合(合并)文件Lucene?

我需要生成一个文件来整合每个特性执行的所有JSON结果

在springboot 3中,当我调用api endpoint时,会出现404

Mapstruct不能正确/完全映射属性

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

继续收到错误SQLJDBC EXCEPTION执行";org.springframework.dao.InvalidDataAccessResourceUsageException:&

是否为计划任务补偿系统睡眠?

向Java进程发送`kill-11`会引发NullPointerException吗?

在java中使用不同的application.properties-jar而不使用Spring

视图被推出线性布局-Android

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

根据应用程序 Select 的语言检索数据

我们可以在方法中声明接口吗?

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

在数组列表中找到对象后,未从数组中删除对象