我正在尝试为动态字符串块创建一个正则表达式。我收到的动态数据具有以下格式:
[Begin] some text goes here.\r\n[Begin] {\r\n[Begin] stage\r\n[Begin] { (dynamicName1)\r\nRandom text here\r\nRandom line2 text\r\nAnd still keeps going\r\n[Begin] }\r\n[Begin] stage\r\n[Begin] { (dynamicName2)\r\nStage dynamicName2 skipped\r\n[Begin] }\r\n
试图提取介于模式之间的字符串,如下所示:
[Begin] { (dynamicName1)\r\n/*trying to extract this data\r\n//which is available here*/\r\n[Begin] }
我正在使用的模式完成了一半的工作,但结果并不精确。我的结果还包含我需要跳过的 dynamicName1)行。尝试这些模式
Pattern 1 - /\[Begin\]\s*{\s*\((\w+(?=\))[\S\s]*?)\[Begin\]\s*}/g
Pattern 2 - /\[Begin\]\s*{\s*\(([\S\s]*?)\[Begin\]\s*}/g
我想念什么吗?
答案 0 :(得分:2)
您可以利用捕获组和锚点:
^\[Begin\]\s+\{\s+\([^()]*\)\s+([\s\S]+?)^\[Begin\][ \t]+}
详细地说:
^\[Begin\] # [Begin] at the beginning of a line
\s+\{\s+\([^()]*\)\s+ # require { and ()
([\s\S]+?) # capture anything including newlines lazily
^\[Begin\]\s+} # up to [Begin] }
请参见a demo on regex101.com(并注意multiline
模式)。
答案 1 :(得分:1)
我们在这里。我建议采用以下模式:
\[Begin\]\s+{\s+\([^()]+\)(.+?)\[Begin\]\s+}
Demo,示例代码:
const regex = /\[Begin\]\s+{\s+\([^()]+\)(.+?)\[Begin\]\s+}/gm;
const str = `[Begin] some text goes here.\\r\\n[Begin] {\\r\\n[Begin] stage\\r\\n[Begin] { (dynamicName1)\\r\\nRandom text here\\r\\nRandom line2 text\\r\\nAnd still keeps going\\r\\n[Begin] }\\r\\n[Begin] stage\\r\\n[Begin] { (dynamicName2)\\r\\nStage dynamicName2 skipped\\r\\n[Begin] }\\r\\n`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log(`Match: ${m[1]}`);
}