【问题标题】:Regexp Pattern for matching Numbers with units and special symbols (ex. "120% g" etc.) and special grouping them用于将数字与单位和特殊符号(例如“120% g”等)匹配并对其进行特殊分组的正则表达式模式
【发布时间】:2021-02-24 17:35:07
【问题描述】:

我想构建可以匹配下一个可能性的正则表达式模式匹配器:

11
2.5 
ca. 111g                   
ca. 120 g Case
11 Kilograms
12.5-125.0 g
ca. 120% g

在这种情况下,我应该始终成为 4 组(以“ca. 12.5-125.0% g”为例):

  1. ca. (数字之前的所有内容)
  2. 12.5-125.0 ()
  3. g (单位)
  4. % (数字后的任何特殊符号)

我已经构建了这个正则表达式,但是在上述所有情况下它都不能正常工作: (\d*[.]?[-]?\d+(?:\s*|\s+))(\w*)(\D)。例如,组并非每次都正确构建,有时“g”落在第三组,有时在第四组......

【问题讨论】:

  • 试试(?:([a-zA-Z]+)\.\s*)?(\d+(?:\.\d+)?(?:\s*-\s*\d+(?:\.\d+)?)?)([^\w\s]*)\s*([a-zA-Z]*) (demo)
  • 请提供示例说明哪些输入无法按您希望的方式工作。

标签: regex


【解决方案1】:

g落在第三组或第四组的可能性是因为\D匹配除数字以外的任何char,也可以匹配chars a-z如\w可以。

例如,在这个字符串1ga 中,g 在第 2 组中。在这个字符串 1g 中,g 在第 3 组中,因为单词字符是可选的,\D 至少需要一个字符。

注意这部分模式(?:\s*|\s+)可以写成\s*。您可以在模式中使用\s,但它也可以匹配换行符。


一个选项可以使模式更具体一些,并在字符类[%]?中列出允许的特殊符号

^(?:(\w+\.) )?(\d+(?:\.\d+)?(?:-\d+(?:\.\d+))?)([%]?)(?: ?(\w+))?

模式匹配

  • ^ 字符串开始
  • (?:(\w+\.) )? 在捕获 group 1 之后可以选择匹配尾随空格, 匹配 1+ 个单词字符和一个点
  • ( 捕获第 2 组
    • \d+(?:\.\d+)? 匹配 1+ 个数字和可选的小数部分
    • (?:-\d+(?:\.\d+))? 可选匹配 - 和 1+ 位,可选小数部分
  • )关闭第二组
  • ([%]?) 捕获第 3 组,匹配可选的“特殊”字符
  • (?: ?(\w+))? 可选匹配空格并捕获 group 4 以匹配 1+ 个单词字符

regex demo

如果没有锚点,您也可以使用单词边界\b,如果开头的点并不总是存在,您可以将其设为可选\.?

\b(?:(\w+\.?) )?(\d+(?:\.\d+)?(?:-\d+(?:\.\d+))?)([%]?)(?: ?(\w+))?

Regex demo

【讨论】:

  • 您好,我发现,当之前的数字只是空格时,这个正则表达式不起作用。前任。 _100g(让我们将 _ 表示为空格)或者当数字之前的字符串不包含点时,例如。 max 110 cm。当然,在第一种情况下,我可以在匹配之前轻松修剪输入字符串。谢谢。
  • @Dawid 例如,您可以将点设为可选,对于数字之前的空格,您可以使用单词边界而不是锚\b(?:(\w+\.?) )?(\d+(?:\.\d+)?(?:-\d+(?:\.\d+))?)([%]?)(?: ?(\w+))? regex101.com/r/4vZqAu/1 或匹配第一个数字之前的空格@987654324 @
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 2019-10-13
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多