我有以下SHAKE LQ 1.30 ML (60 MG) PO QD FOR 7 DAYS THEN DR
,并试图只识别30 ML
。
我已经尝试了以下内容,但捕获了1.30 ML
中的30
。
((30|45|60)(s)?(ML))
我怎么能不捕获十进制值的整数组合。
您想从像SHAKE LQ 30 ML (60 MG)
这样的字符串中提取30 ML
,并在像SHAKE LQ 1.30 ML (90 MG)
这样的字符串中检测到不匹配。
您可以使用
(?<!d)(?<!d.)((30|45|60)s?(ML))b
查看正则表达式演示
详
(?<!d)(?<!d.)
-.
在 数((30|45|60)s?(ML))
- 捕获组 1:(30|45|60)
- 捕获组 2:30
、45
或60
s?
- 可选的空格(ML)
- 捕获组 3:ML
b
- 单词边界。
十进制是:
d+.d{2}s
解释:
d number
+ one or more preceding character
. literal dot
{2} exactly two preceding characters
s white space
编辑。 非十进制为:
[^.]d{2}s
JavaScript 中的示例:
s1='SHAKE LQ 30 ML (60 MG) PO QD FOR 7 DAYS THEN DR';
s2='SHAKE LQ 1.30 ML (60 MG) PO QD FOR 7 DAYS THEN DR';
r=/[^.]d{2}s+ML/
console.log(r.exec(s1)); //returns 30ML in array
console.log(r.exec(s2)); //returns null
尝试d?.d+(*SKIP)(?!)|((30|45|60)s?(ML))
演示
如果不支持 pcre
试试(?<![d.])((30|45|60)s?(ML))
演示