繁体   English   中英

如何使用正则表达式从字符串中获取不同类型的值?

[英]How to use regex to get different kind of values from string?

19y.o. (Jun 24, 1987) 5'7" 148lbs
33y.o. (Jun 24, 1987) 5'7" 159lbs
21y.o. (Dec 3, 1998) 5'6" 143lbs

我正在尝试过去两个小时的 regex101 我想从字符串中获取以下信息。

{
  age: 19,
  dob: Jun 24, 1987,
  height: 5'7",
  weight: 148
}
{
  age: 33,
  dob: Jun 24, 1987,
  height: 5'7",
  weight: 159
}
{
  age: 21,
  dob: Dec 3, 1998,
  height: 5'6",
  weight: 143
}

我试过^\dy$(?:...)但我无法接近我想要的。 真的需要一些帮助和解释如何从单个字符串中获取 4 种不同类型的信息。

您可以使用 4 个捕获组来获取单独的数据

^(\d+)[^()]*\(([^()]+)\)\s+(\d+'\d+")\s+(\d+)lbs$
  • ^字符串开头
  • (\d+)捕获组 1 1+ 位
  • [^()]*\(匹配除()以外的任何字符 0+ 次并匹配(
  • ([^()]+)捕获组 2 1+ 次除()以外的任何字符
  • \)\s+匹配)和 1+ 个空白字符
  • (\d+'\d+")\s+捕获组 3 1+ 数字' 1+ 数字和"后跟匹配 1+ 空白字符
  • (\d+)lbs捕获组 4 1+ 数字后跟匹配的lbs
  • $字符串结尾

正则表达式演示

或者更具体的日期格式部分:

^(\d+)[^()]*\(([A-Z][a-z]{2}\s+(?:[1-9]|[12]\d|3[01]),\s+\d{4})\)\s+(\d+'\d+")\s+(\d+)lbs$

正则表达式演示

没有标记语言,但例如在 Javascript 中:

 const regex = /^(\d+)[^()]*\(([^()]+)\)\s+(\d+'\d+")\s+(\d+)lbs$/m; [ `19y.o. (Jun 24, 1987) 5'7" 148lbs`, `33y.o. (Jun 24, 1987) 5'7" 159lbs`, `21y.o. (Dec 3, 1998) 5'6" 143lbs` ].forEach(s => { const match = s.match(regex); if (match) { const result = { age: match[1], dob: match[2], height: match[3], weight: match[4] } console.log(result); } })

或者使用命名的捕获组:

 const regex = /^(?<age>\d+)[^()]*\((?<dob>[AZ][az]{2}\s+(?:[1-9]|[12]\d|3[01]),\s+\d{4})\)\s+(?<height>\d+'\d+")\s+(?<weight>\d+)lbs$/m; [ `19y.o. (Jun 24, 1987) 5'7" 148lbs`, `33y.o. (Jun 24, 1987) 5'7" 159lbs`, `21y.o. (Dec 3, 1998) 5'6" 143lbs` ].forEach(s => { const match = s.match(regex); if (match) { console.log(match.groups); } })

如果你使用这个表达式:

^(\d{2})[^\(]+\((.+)\) (\d'\d") (\d+lbs)$

匹配组的值如下:

0: 19y.o. (Jun 24, 1987) 5'7" 148lbs
1: 19
2: Jun 24, 1987
3: 5'7"
4: 148lbs

这个特定测试字符串的一个问题是它同时包含单引号和双引号,这使得在我熟悉的大多数编程语言中定义字符串文字变得很棘手。 这就是它在 Python 中的样子。

import re

test = r"19y.o. (Jun 24, 1987) 5'7" + r'" 148lbs'
expr = r"^(\d{2})[^\(]+\((.+)\) (\d'\d" + r'") (\d+lbs)$'
match = re.match(expr, test)
for g in match.groups():
    print(g)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM