使用正则表达式获取数字和字符串中的后续字符

时间:2018-09-22 07:25:45

标签: regex

例如,我有字符串PIRITON 4MG 10TABLET。我想将它们分为药品名称PIRITON 4MG和数量10TABLET。有时,整数数量(例如10)和封装类型(例如TABLET)之间可能会有空格,例如tabletstripbottle

当前,我有以下正则表达式:

.(\d+(?:\.\d*)?)(\s|)(TAB|tab|TABLET|tablet|strip|STRIP|bottle|BOTTLE|tube|TUBE|sachet|SACHET)

但是,我希望它获取整数后面的任何字符,但是忽略整数后跟MGML以排除权重(例如4MG)。这样可以包括我在结果中未曾想到的包类型。我将如何去做?

2 个答案:

答案 0 :(得分:1)

看来您的问题比您想象的要简单。模式似乎是这样的:

  

药品名称,一些数字,一些单位,再一些数字,一些其他单位

确切的分隔符等实际上并不重要:您可以有效地使用数字来标识其他组件:

(\D+)(\d+)(\D+)(\d+)(\D+)

在使用组之前先对它们进行剥离,以免出现可选的空格问题(始终在组1、3、5中)。如果您想始终跳过金额,则无需捕获它:

(\D+)\d+\D+(\d+)(\D+)

如果要将单位大小分组到药品名称中,请将它们一起捕获:

(\D+\d+\D+)(\d+)(\D+)

通过使用\D+,您完全可以避免对单位名称进行硬编码,因此混合大小写,复数形式和新单位将不会成为问题。

答案 1 :(得分:0)

您可以使用2个捕获组:

^(.+?[ ]+\d+(?:M[GL]))[ ]+(\d+[ ]*.+)$

Regex demo

说明

  • ^断言行的开头
  • (开始捕获组
    • .+?[ ]+\d+M[GL]使用字符类将任意字符匹配一次或多次非贪婪,一次或多次空格后跟一个数字以及MG或ML
  • )关闭捕获组
  • [ ]+匹配一个或多个空格
  • (开始捕获组
    • \d+[ ]*.+匹配一个或多个数字,然后匹配零个或多个空格,任何字符一次或多个
  • )关闭捕获组
  • $声明字符串的结尾