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

Javascript 如何使用正则表达式从字符串中获取不同类型的值?,javascript,regex,Javascript,Regex,我在过去两个小时尝试regex101,我想从字符串中获得以下信息 19y.o. (Jun 24, 1987) 5'7" 148lbs 33y.o. (Jun 24, 1987) 5'7" 159lbs 21y.o. (Dec 3, 1998) 5'6" 143lbs 我试过^\dy$(?:…),但我无法接近我想要的东西。对于如何从一个字符串中获取4种不同类型的信息,确实需要一些帮助和解释。如果使用此表达式: { age: 19, dob: Jun 24,

我在过去两个小时尝试regex101,我想从字符串中获得以下信息

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

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

如果使用此表达式:

{
  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
}
匹配组的值如下所示:

^(\d{2})[^\(]+\((.+)\) (\d'\d") (\d+lbs)$
这个特殊的测试字符串的一个问题是它同时包含单引号和双引号,这使得在我熟悉的大多数编程语言中定义字符串文字非常困难。这是Python中的外观

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

如果使用此表达式:

{
  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
}
匹配组的值如下所示:

^(\d{2})[^\(]+\((.+)\) (\d'\d") (\d+lbs)$
这个特殊的测试字符串的一个问题是它同时包含单引号和双引号,这使得在我熟悉的大多数编程语言中定义字符串文字非常困难。这是Python中的外观

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

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

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)
  • ^
    字符串的开头
  • (\d+)
    捕获组11+位
  • [^()]*\(
    匹配除
    和匹配
  • ([^()]+)
    捕获组21+次除
  • \)\s+
    匹配
    和1+空格字符
  • (\d+“\d+”)\s+
    捕获第3组1+位数
    1+位数和
    ,然后匹配1+空格字符
  • (\d+)磅
    捕获第4组1+位数,然后匹配
    lbs
  • $
    字符串结尾

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

^(\d+)[^()]*\(([^()]+)\)\s+(\d+'\d+")\s+(\d+)lbs$

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

const regex=/^(\d+[^()]*\([^()]+)\s+(\d+'\d+)\s+(\d+)磅/米;
[
`19y.o.(1987年6月24日)5'7“148磅`,
`33y.o.(1987年6月24日)5'7“159磅`,
`21y.o.(1998年12月3日)5英尺6英寸143磅`
].forEach(s=>{
常量匹配=s.match(正则表达式);
如果(匹配){
常数结果={
年龄:匹配[1],
dob:匹配[2],
高度:匹配[3],
重量:匹配[4]
}
控制台日志(结果);
}

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

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)
  • ^
    字符串的开头
  • (\d+)
    捕获组11+位
  • [^()]*\(
    匹配除
    和匹配
  • ([^()]+)
    捕获组21+次除
  • \)\s+
    匹配
    和1+空格字符
  • (\d+“\d+”)\s+
    捕获第3组1+位数
    1+位数和
    ,然后匹配1+空格字符
  • (\d+)磅
    捕获第4组1+位数,然后匹配
    lbs
  • $
    字符串结尾

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

^(\d+)[^()]*\(([^()]+)\)\s+(\d+'\d+")\s+(\d+)lbs$

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

const regex=/^(\d+[^()]*\([^()]+)\s+(\d+'\d+)\s+(\d+)磅/米;
[
`19y.o.(1987年6月24日)5'7“148磅`,
`33y.o.(1987年6月24日)5'7“159磅`,
`21y.o.(1998年12月3日)5英尺6英寸143磅`
].forEach(s=>{
常量匹配=s.match(正则表达式);
如果(匹配){
常数结果={
年龄:匹配[1],
dob:匹配[2],
高度:匹配[3],
重量:匹配[4]
}
控制台日志(结果);
}

})
您可以使用4个捕获组来获取值
^(\d+[^()]*\([^()]+\)\s+(\d+'\d+)\s+(\d+)lbs$
从单个示例来看,没有明显有用的概括。请您展示几个示例输入和预期输出,以及您迄今为止的一次或两次尝试。此外,更新标记以显示确切的目标正则表达式变量;另请参见您可以使用4个捕获组来获取值
^(\d+[^()]*\(([^()]+\)\s+(\d+'\d+”)\s+(\d+)lbs$
从一个示例来看,没有明显有用的概括。您能展示几个示例输入和预期输出,以及您到目前为止的一两次尝试吗?另外,请更新标记以显示哪个regex变量正好是目标;另请参阅