regex 用于匹配lemmy spoiler标记的正则表达式

nzrxty8p  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(95)

我正在尝试编写正则表达式(JS风格),以匹配文本中的剧透。

// this should match with group title = "title of the spoiler" and body = "content"
// and it's only one working for now :/

::: spoiler title of the spoiler
content
:::

// this should match

::: spoiler title
content
on multiple
lines

**with some style**
:::

// this should match

::: spoiler title
body
containing
colon:
:::

字符串
以下是我目前拥有的:

:::\sspoiler\s+(?<title>.+)\n(?<body>.+)\n:::


然而,它不匹配包含换行符的剧透,只有第一个例子是工作。
link到regex101.com
先谢了。

umuewwlo

umuewwlo1#

你可以使用这个正则表达式来获得正确的匹配:

:::\s+spoiler\s+(?<title>.+)\n(?<body>.(?:.*\n)+?):::

字符串
Updated RegEx Demo

RegEx详情:

  • ::::匹配开始:::
  • \s+:匹配1+空格
  • spoiler:匹配文本spoiler
  • \s+:匹配1+空格
  • (?<title>.+):匹配名为title的捕获组中任意字符的1+
  • \n:匹配换行符
  • (?<body>.:以字符开头的名为body的捕获组
  • (?:.*\n)+?:匹配0或后跟换行符的任何字符,并重复该组1+次(惰性)
  • )
  • :::匹配结束:::
7uhlpewt

7uhlpewt2#

您可以Assert,在匹配标题的单个非空白字符之后,接下来的行只有空白字符,直到匹配行首的:::

:::\sspoiler\s+(?<title>\S.*)\n(?!\s*^:::)(?<body>(?:.*\n)+?):::

字符串

说明

  • :::按字面意思匹配(如果必须在字符串的开头,则使用^:::
  • \sspoiler\s+匹配一个空白字符,然后spoiler后跟1+个空白字符
  • (?<title>\S.*)命名组 title,匹配一个非空格字符,然后匹配该行的其余部分
  • \n(?!\s*^:::)匹配一个新行,并在一行的开头Assert直到:::的空白字符
  • (?<body>(?:.*\n)+?)命名组 body,重复匹配所有行,尽可能少
  • :::按字面匹配

Regex demo
或者对于JavaScript,[^]匹配包括换行符在内的任何字符:

:::\sspoiler\s+(?<title>\S.*)\n(?!\s*^:::)(?<body>[^]*?)\n:::


Regex demo

注意\s也可以匹配换行符

相关问题