例如,我有字符串PIRITON 4MG 10TABLET
。我想将它们分为药品名称PIRITON 4MG
和数量10TABLET
。有时,整数数量(例如10
)和封装类型(例如TABLET
)之间可能会有空格,例如tablet
,strip
,bottle
等
当前,我有以下正则表达式:
.(\d+(?:\.\d*)?)(\s|)(TAB|tab|TABLET|tablet|strip|STRIP|bottle|BOTTLE|tube|TUBE|sachet|SACHET)
但是,我希望它获取整数后面的任何字符,但是忽略整数后跟MG
或ML
以排除权重(例如4MG
)。这样可以包括我在结果中未曾想到的包类型。我将如何去做?
答案 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+[ ]*.+)$
说明
^
断言行的开头(
开始捕获组
.+?[ ]+\d+M[GL]
使用字符类将任意字符匹配一次或多次非贪婪,一次或多次空格后跟一个数字以及MG或ML )
关闭捕获组[ ]+
匹配一个或多个空格(
开始捕获组
\d+[ ]*.+
匹配一个或多个数字,然后匹配零个或多个空格,任何字符一次或多个)
关闭捕获组$
声明字符串的结尾