正则表达式只获得多行匹配

时间:2021-06-05 14:02:18

标签: javascript regex

尝试使用正则表达式仅匹配多行字符串。但下面的正则表达式匹配单行和多行。我如何使用正则表达式来实现这一点?

正则表达式

('|"|`)[\s\S]*?(\1)

测试字符串

"not a match"
"need
to
match"

https://regex101.com/r/DXahXG/1

3 个答案:

答案 0 :(得分:2)

您的输入字符串在双引号之间包含三个潜在的子字符串:

  • "not a match"
  • "\n"
  • "need\nto\nmatch"

这意味着,您几乎不能依赖环视,因为正则表达式引擎有可能选择失败对的结尾 " 作为下一个双引号对的前导 "(['"`])(?:(?!\1).)*\n[\s\S]*?\1 正则表达式是此问题的illustration

在这方面,使用正则表达式然后过滤掉所有包含换行符的匹配项要安全得多:

const text = '"not a match"\n"need\nto\nmatch"';
const rx = /(['"`]).*?\1/gs;
console.log( text.match(rx).filter(x => x.includes('\n')) )

答案 1 :(得分:0)

多行字符串是至少包含一个换行符的字符串。所以你可以写

('|"|`)[\s\S]*?\n[\s\S]*(\1)

但这将匹配您的整个示例,因为 [\s\S]* 也匹配字符串分隔符。

你可能想试试

'[^']*?\n[^']*?'|"[^']*?\n[^']*?"|`[^']*?\n[^']*?`

但是那个不匹配转义引号。

答案 2 :(得分:-1)

也许 this 太复杂了?

('|"|`)(?:(?:(?!\1).)+?\n)+(?:(?!\1).)+\1

分解:

                ┌─ matches 1 or more of this
                │                ┌─ followed by one or more
                │                │  non-quote-like characters
                │                │      ┌─ matches closing
       ┌────────┴─────────┐┌─────┴────┐┌┤  quote-like characters
('|"|`)(?:(?:(?!\1).)+?\n)+(?:(?!\1).)+\1
└──┬──┘   │  │    ││     │
   └────────────────────────────── matches opening quote-like character
          │  │    ││     │         and captures it in group 1
          │  │    ││     │
          │  └──┬─┘└─────│──────── matches any character
          │     └────────│──────── which is not an quote-like character
          └────┬─────────┘
               └──────── and matches 1 or more of them, as few as possible
                         followed by line break