匹配浮点数后跟一些固定字符串的正则表达式模式
Regex pattern for matching float followed by some fixed strings
我想要一个可以匹配以下情况的正则表达式模式:
0, 1, 0.1, .1, 1g, 0.1g, .1g, 1(g/100ml), .1(g/ml)
如果正则表达式与模式匹配,我只想捕获数字部分(0,1,0.1..
)
我尝试使用以下正则表达式,但它匹配很多情况:
((?=\.\d|\d)(?:\d+)?(?:\.?\d*))|((?=\.\d|\d)(?:\d+)?(?:\.?\d*))[a-zA-Z]+?|\([^)]*\)
如何使用单个正则表达式模式实现上述目标?
编辑:
使问题解决方案更通用
什么是匹配下面的单个正则表达式
- 任意数值(0、1、0.1、...)
- 任何数字后跟 g、mg 任何字符(0.1g、.1mg、100kg)
- 任何数字后跟括号中的任何内容 - .1(g/100ml), 100(mg/1kg)
并且只捕获数字部分
您可以使模式更具体一些,并为数字使用捕获组,并可选择匹配后面的内容,或者(根据 @ anubhava 的评论更新)添加单词边界以防止再次部分匹配。
(\d*\.?\d+)(?:\(g\/\d*ml\)|g?\b)
(\d*\.?\d+)
捕获组1,匹配可选数字,可选.
和1+数字
(?:
交替的非捕获组
\(g\/\d*ml\)
匹配 (g/
个可选数字和 ml)
|
或
g?\b
匹配可选的 g
后跟单词边界
)
关闭非捕获组
如果值应该在逗号分隔的字符串中匹配,您可以断言 ,
或字符串的结尾到右边。
(\d*\.?\d+)(?:\(g\/\d*ml\)|g)?(?=,|$)
编辑
用于匹配数字后括号或可选字符 a-zA-Z 之间任何内容的广泛模式:
(\d*\.?\d+)(?:\([^()]*\)|[a-zA-Z]*\b)
(\d*\.?\d+)
捕获组1,匹配可选数字,可选.
和1+数字
(?:
非捕获组
\([^()]*\)
从左括号到右括号匹配
|
或
[a-zA-Z]*\b
可选择匹配 a-zA-Z 范围内的字符,后跟单词边界
)
关闭非捕获组
EDIT2: 使用 OP 的编辑样本(匹配 0, 1, 0.1
OR (0.1g, .1mg, 100kg)
OR .1(g/100ml), 100(mg/1kg)
), 在此处添加以下解决方案。解释与第一个解决方案相同,唯一的问题是尽管匹配了特定的字符串,但我更改了正则表达式以匹配此处的任何字母。
(\d*\.?\d+)(?:[a-zA-Z]+|\([a-zA-Z]+(?:\/\d*(?:[a-zA-Z]+))?\)|(?:,\s+|$))
EDIT1: 根据 OP 的评论匹配 .01c 和 100(g/1000L) 添加以下正则表达式的示例,这是对此处第一个解决方案的小编辑。
(\d*\.?\d+)(?:g|cc|\(g(?:\/\d*(?:ml|L))?\)|(?:,\s+|$))
使用您显示的示例,请在此处尝试使用正则表达式。
(\d*\.?\d+)(?:g|\(g(?:\/\d*ml)?\)|(?:,\s+|$))
解释:为以上添加详细解释。
(\d*\.?\d+) ##Matching digits 0 or more occurrences followed by .(optional, followed by 1 or more digits occurrences here.
(?: ##Starting a non-capturing group here.
g| ##matching only g here OR.
\(g(?:\/\d*ml)?\)| ##Matching (g) OR (g/digits ml) here OR.
(?:,\s+|$) ##Matching comma followed by 1 or more spaces occurrences OR end of value here.
) ##Closing non-capturing group here.
试试这个:
[\d]?\.?\d+(?:g|(?<p>\()(?(p)g\/(?:\d+)?ml\)))?
我想要一个可以匹配以下情况的正则表达式模式:
0, 1, 0.1, .1, 1g, 0.1g, .1g, 1(g/100ml), .1(g/ml)
如果正则表达式与模式匹配,我只想捕获数字部分(0,1,0.1..
)
我尝试使用以下正则表达式,但它匹配很多情况:
((?=\.\d|\d)(?:\d+)?(?:\.?\d*))|((?=\.\d|\d)(?:\d+)?(?:\.?\d*))[a-zA-Z]+?|\([^)]*\)
如何使用单个正则表达式模式实现上述目标?
编辑:
使问题解决方案更通用 什么是匹配下面的单个正则表达式
- 任意数值(0、1、0.1、...)
- 任何数字后跟 g、mg 任何字符(0.1g、.1mg、100kg)
- 任何数字后跟括号中的任何内容 - .1(g/100ml), 100(mg/1kg)
并且只捕获数字部分
您可以使模式更具体一些,并为数字使用捕获组,并可选择匹配后面的内容,或者(根据 @ anubhava 的评论更新)添加单词边界以防止再次部分匹配。
(\d*\.?\d+)(?:\(g\/\d*ml\)|g?\b)
(\d*\.?\d+)
捕获组1,匹配可选数字,可选.
和1+数字(?:
交替的非捕获组\(g\/\d*ml\)
匹配(g/
个可选数字和ml)
|
或g?\b
匹配可选的g
后跟单词边界
)
关闭非捕获组
如果值应该在逗号分隔的字符串中匹配,您可以断言 ,
或字符串的结尾到右边。
(\d*\.?\d+)(?:\(g\/\d*ml\)|g)?(?=,|$)
编辑
用于匹配数字后括号或可选字符 a-zA-Z 之间任何内容的广泛模式:
(\d*\.?\d+)(?:\([^()]*\)|[a-zA-Z]*\b)
(\d*\.?\d+)
捕获组1,匹配可选数字,可选.
和1+数字(?:
非捕获组\([^()]*\)
从左括号到右括号匹配|
或[a-zA-Z]*\b
可选择匹配 a-zA-Z 范围内的字符,后跟单词边界
)
关闭非捕获组
EDIT2: 使用 OP 的编辑样本(匹配 0, 1, 0.1
OR (0.1g, .1mg, 100kg)
OR .1(g/100ml), 100(mg/1kg)
), 在此处添加以下解决方案。解释与第一个解决方案相同,唯一的问题是尽管匹配了特定的字符串,但我更改了正则表达式以匹配此处的任何字母。
(\d*\.?\d+)(?:[a-zA-Z]+|\([a-zA-Z]+(?:\/\d*(?:[a-zA-Z]+))?\)|(?:,\s+|$))
EDIT1: 根据 OP 的评论匹配 .01c 和 100(g/1000L) 添加以下正则表达式的示例,这是对此处第一个解决方案的小编辑。
(\d*\.?\d+)(?:g|cc|\(g(?:\/\d*(?:ml|L))?\)|(?:,\s+|$))
使用您显示的示例,请在此处尝试使用正则表达式。
(\d*\.?\d+)(?:g|\(g(?:\/\d*ml)?\)|(?:,\s+|$))
解释:为以上添加详细解释。
(\d*\.?\d+) ##Matching digits 0 or more occurrences followed by .(optional, followed by 1 or more digits occurrences here.
(?: ##Starting a non-capturing group here.
g| ##matching only g here OR.
\(g(?:\/\d*ml)?\)| ##Matching (g) OR (g/digits ml) here OR.
(?:,\s+|$) ##Matching comma followed by 1 or more spaces occurrences OR end of value here.
) ##Closing non-capturing group here.
试试这个:
[\d]?\.?\d+(?:g|(?<p>\()(?(p)g\/(?:\d+)?ml\)))?