我想从具有以下模式的文本中提取一些数据。
text1
text1|text2
text1|text2[text3]
text1|text2[text3] text4
(text1|text2[text3], text4)
text1[text3]
text1[text3], text4到目前为止,我成功地构造了两个表达式,当第一个表达式失败时,它又回到了第二个表达式上。
/\(?([^|[]*)\|?([^[]*)\[?(.*)\],?\s?([^)]*)\)?/
/([^|]*)\|?(.*)/
也许有更好的方法来解析它。
是否有可能用一个正则表达式捕捉上面的所有内容?
谢谢你的帮助
示例
const items = [
"text1",
"text1|text2",
"text1|text2[text3]",
"text1|text2[text3] text4",
"(text1|text2[text3], text4)",
"text1[text3]",
"text1[text3], text4"
]
const parse = (text) => {
const [_, text1, text2, text3, text4] = /\(?([^|[]*)\|?([^[]*)\[?(.*)\],?\s?([^)]*)\)?/.exec(text)
|| /([^|]*)\|?(.*)/.exec(text)
return {
text1,
text2,
text3,
text4
};
}
for(const text of items) {
console.log(parse(text));
}
发布于 2021-10-04 21:33:11
您可以使用
const items = [
"text1",
"text1|text2",
"text1|text2[text3]",
"text1|text2[text3] text4",
"(text1|text2[text3], text4)",
"text1[text3]",
"text1[text3], text4"
]
const parse = (text) => {
const [_, text1, text2, text3, text4] = /^\(?([^[|]+)(?:\|([^[]+))?(?:\[([^\][]*)](?:\s*(?:,\s*)?([^\s)].*?))?)?\)?$/.exec(text)
return {
text1,
text2,
text3,
text4
};
}
for(const text of items) {
console.log(text, parse(text));
}
见regex演示。详细信息
^ -字符串的开始\(? -一个可选的)([^[|]+) -第1组:[和|以外的一个或多个字符(?:\|([^[]+))? -一个可选的|序列,然后是第2组:除[之外的任何一个或多个字符(尽可能多)(?:\[([^\][]*)](?:\s*(?:,\s*)?([^\s)].*?))?)? -一个可选的序列\[([^\][]*)] - [,除[和] (捕获到第3组)以外的零个或多个字符,然后是一个](?:\s*(?:,\s*)?([^\s)].*?))? -一个可选的序列\s* -零或更多空格字符(?:,\s*)? -一个可选的,序列和零或多个空格字符([^\s)].*?) -第4组:除空格和)之外的字符,然后除行中断字符以外的零或多个字符,尽可能少。\)? -一个可选的)$ -字符串的末端。https://stackoverflow.com/questions/69442458
复制相似问题