首页 > 解决方案 > 在多行字符串中,如何匹配每行以管道字符开头的新行序列

问题描述

嘿,我有一个类似这样的字符串:

细绳:

foo | bar
|foo | bar
|foo bar
|bar foo foo
foo bar
|bar foo
|foo bar
bar

我需要一个匹配第一个“|”中所有内容的正则表达式 在一行开始到不以“|”开头的第一行 (作为一场比赛)。因此,所示示例中的匹配将如下所示:

正确匹配:

[
|foo | bar
|foo bar
|bar foo foo
,
|bar foo
|foo bar
]

我想出了这个/\|([\s\S]+)(\n\|)/g,但它与以下内容匹配并且不正确:

不正确的匹配:

[
| bar
|foo | bar
|foo bar
|bar foo foo
foo bar
|bar foo
|
]

我希望你能理解我的需要,并感谢你的时间!

标签: javascriptregexsplitmatchmultiline

解决方案


回答

根据您的问题,从第一个“|”开始匹配所有内容 在不以“|”开头的第一行的开头,您可以使用此正则表达式:

/^\|([\s\S]*?)(?:(?!^[^\|])[\s\S])*/gm

重要的是要注意,m为了匹配多行字符串,需要标志(多行)。

给你示例字符串

foo | bar
|foo | bar
|foo bar
|bar foo foo
foo bar
|bar foo
|foo bar
bar

这将匹配

|foo | bar
|foo bar
|bar foo foo

|bar foo
|foo bar

这个怎么运作:

^\|匹配任何以“|”开头的行 特点。然后,([\s\S]*?)匹配 0 个或多个任何字符,包括新行“Lazily”(意味着只捕获最小值)。最后(?:(?!^[^\|])[\s\S])*匹配到一个^不以“|”开头的新行()( [^\|])。

这是一个指向Regexr的链接,它显示了更多关于它的工作原理以及它的实际操作示例。

const str =
`foo | bar
|foo | bar
|foo bar
|bar foo foo
foo bar
|bar foo
|foo bar
bar`

console.log(str.match(/^\|([\s\S]*?)(?:(?!^[^\|])[\s\S])*/gm))


推荐阅读