我正在编写一个正则表达式(用于Java,如果这很重要),它试图匹配$后面的数字(可以是浮点数),但前面的单词不能是'LOST'。
如果有多个可能的匹配,应返回第一个数字。
为简单起见,假设所有单词都是大写的。
例如,在以下句子中:“我花了$10.12买啤酒”,将匹配到10.12。在句子“我在游戏中输了$11.34”,将没有匹配。在“我在游戏中输了$11.34,并且花了$10.12买啤酒”这个句子中,仍然会匹配到10.12。
我想到的正则表达式是:
我的正则表达式通常都能正常工作,不过我想知道是否有更简单的写法,或者是否有一些特殊情况我没有考虑到。一个小问题是,如果在LOST和$之间有多于一个空格,我仍然不想匹配,但是目前我的正则表达式会匹配。不幸的是,负向回顾需要固定的宽度。
澄清一下:当我说“它前面的单词不是'LOST'时”,我指的是在'$'之前不能有'LOST\s*'。这意味着'LOST $123'和'LOST $123'都不应该匹配123,但是'LOST! $123'可以匹配123。这样做的原因是货币不应该直接受到'LOST'的影响;如果在LOST和$之间有除了空格之外的任何字符,那么货币很可能不是直接受到'LOST'的影响。
如果有多个可能的匹配,应返回第一个数字。
为简单起见,假设所有单词都是大写的。
例如,在以下句子中:“我花了$10.12买啤酒”,将匹配到10.12。在句子“我在游戏中输了$11.34”,将没有匹配。在“我在游戏中输了$11.34,并且花了$10.12买啤酒”这个句子中,仍然会匹配到10.12。
我想到的正则表达式是:
.*?(?<!LOST )[$]\s*(?<NUMBER>[0-9]*[.]?[0-9]*).*
我的正则表达式通常都能正常工作,不过我想知道是否有更简单的写法,或者是否有一些特殊情况我没有考虑到。一个小问题是,如果在LOST和$之间有多于一个空格,我仍然不想匹配,但是目前我的正则表达式会匹配。不幸的是,负向回顾需要固定的宽度。
澄清一下:当我说“它前面的单词不是'LOST'时”,我指的是在'$'之前不能有'LOST\s*'。这意味着'LOST $123'和'LOST $123'都不应该匹配123,但是'LOST! $123'可以匹配123。这样做的原因是货币不应该直接受到'LOST'的影响;如果在LOST和$之间有除了空格之外的任何字符,那么货币很可能不是直接受到'LOST'的影响。
\s*
,找到紧邻$
左侧的下一个位置,该位置不以空格为前导,并使用另一个反向预查(?<!\s)
,然后将当前的反向预查放在那里:(?<!\s)(?<!\bLOST)\s*\$(?<NUMBER>\d+(?:\.\d+)?)
- undefined