javascript - 在多行字符串中,如何匹配每行以管道字符开头的新行序列
问题描述
嘿,我有一个类似这样的字符串:
细绳:
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
|
]
我希望你能理解我的需要,并感谢你的时间!
解决方案
回答
根据您的问题,从第一个“|”开始匹配所有内容 在不以“|”开头的第一行的开头,您可以使用此正则表达式:
/^\|([\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))
推荐阅读
- dll - 用什么程序可以打开dll文件
- java - JCommander 是否支持不带前缀的动态参数?
- sql-server - 在存储过程中为服务器创建别名
- sql - 如果一列值没有变化,则 SQL 查询以获取最旧的 start_date
- firebase - 如何使用共享首选项保持用户登录颤动
- r - R:有没有办法计算每行中连续数字的数量?
- bash - 匹配成功后 awk 打印“匹配”
- python - PDF 文件处理(打开一个大的 pdf 文件,找到一个关键字,然后保存在哪个页面中找到了,然后将这些页面拆分并合并到一个 pdf 中)
- postman - 使用邮递员测试脚本从 JSON 响应中解析嵌套元素
- python - 在这种情况下如何执行正确的 if 函数?