Regex101:https://regex101.com/r/oUbqBw/1
因此,我需要在评估者的数组中获取selectedSurvey(检查),feedbackType(检查)和每个对象的名称/电子邮件(数组可以有N个具有这些键的对象)。
从示例中可以看出,这是我在捕获组#3上得到的结果:
`John Doe","email":"john@doe.com"},{"name":"Jane Doe`
我知道这是因为我使用了贪婪的捕捉群体,但即使是非贪婪的我也无法让它发挥作用(正确地命名,但无法捕捉)电子邮件)。
答案 0 :(得分:2)
正如其他人指出的那样,使用json解析器可能会更好。如果你真的必须,我会使用这个正则表达式(demo):
{
"selectedSurvey":"([^"]+)",
"feedbackType":"([^"]+)",
"assessors":\[
((?:{"name":"([^"]*)","email":"([^"]*)"},?)*)
]
}/mx
说明:
/x
开关可让您将正则表达式写入多行。即whitepsaces将被忽略,但表达式将更具可读性。"([^"]*)"
而不是贪婪/懒惰的限定符。它说:“引用,然后捕获所有非引用字符,然后另一个引用”。只要您在属性中没有转义引号,这就没问题了。\[((?:{...},?)*)]
。
{...}
将匹配数组中的一个项目(?:{...},?)
将匹配一个项目和一个可选的逗号。即最后一个数组项后面没有逗号。我们不想捕获这个群体。我们将捕获所有重复。因此,它是一个非捕获组:(?:...)
((?:{...},?)*)
- 内部非捕获组有一个修饰符:*
,即可以有更多这样的东西。然后,我们用一组捕获所有重复。split
此数组并使用此正则表达式解析它们:"([^"]*)"
。答案 1 :(得分:1)
yaml数据看起来像json 在javascript中,您可以使用JSON.parse来解析来自JSON的数据。
var str = '{"selectedSurvey":"Performance Survey","feedbackType":"official","assessors":[{"name":"John Doe","email":"john@doe.com"},{"name":"Jane Doe","email":"jane@doe.com"}]}';
var obj = JSON.parse(str);
console.log("selectedSurvey: "+ obj.selectedSurvey);
console.log("feedbackType : "+ obj.feedbackType);
for (var i in obj.assessors) {
console.log("assessor "+ i +": "+ obj.assessors[i].name+ ", " +obj.assessors[i].email);
}
答案 2 :(得分:1)
尝试这样的事情:
(?<="selectedSurvey":")([^"]+)|(?<="feedbackType":")([^"]+)|(?<="name":")([^"]+)|(?<="email":")([^"]+)
此正则表达式包含4个备选方案,每个方案都包含:
每个选项都有不同的项目标题: selectedSurvey , feedbackType , 名称和电子邮件。
由于g
(全局)选项,每个“有趣”项都会被捕获
各个捕获小组的出现顺序。
因此,您捕获的示例中包含的源文本将被捕获 以下方式: