正则表达式以匹配两行

时间:2018-07-19 15:01:34

标签: javascript regex

我正在尝试为动态字符串块创建一个正则表达式。我收到的动态数据具有以下格式:

[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

我想念什么吗?

2 个答案:

答案 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]}`);
}