【发布时间】:2022-01-10 01:29:42
【问题描述】:
假设我有以下markdown 列表项:
- [x] Example of a completed task.
- [x] ! Example of a completed task.
- [x] ? Example of a completed task.
我有兴趣使用 regex 解析该项目并提取以下组捕获:
-
$1:当符号x介于两者之间时,左边的[和右边的]括号 -
$2:括号[和]之间的符号x -
$3:!之后的修饰符[x] -
$4:在[x]之后的修饰符? -
$5:[x]后面没有修饰符的文本,例如[x] This is targeted. -
$6:[x] !后面的文字 -
$7:[x] ?后面的文字
在使用在线解析器进行大量试验和错误之后,我想出了以下内容:
((?<=x)\]|\[(?=x]))|((?<=\[)x(?=\]))|((?<=\[x\]\s)!(?=\s))|((?<=\[x\]\s)\?(?=\s))|((?<=\[x\]\s)[^!?].*)|((?<=\[x\]\s!\s).*)|((?<=\[x\]\s\?\s).*)
为了使上面的regex 更具可读性,这些捕获组一一列出:
-
$1:((?<=x)\]|\[(?=x])) -
$2:((?<=\[)x(?=\])) -
$3:((?<=\[x\]\s)!(?=\s)) -
$4:((?<=\[x\]\s)\?(?=\s)) -
$5:((?<=\[x\]\s)[^!?].*) -
$6:((?<=\[x\]\s!\s).*) -
$7:((?<=\[x\]\s\?\s).*)
这很可能不是最好的方法,但至少它似乎捕捉到了我想要的:
我想扩展 regex 以捕获 markdown 表中的行
看起来像这样:
| | Task name | Plan | Actual | File |
| :---- | :-------------------------------------- | :---------: | :---------: | :------------: |
| [x] | Task one with a reasonably long name. | 08:00-08:45 | 08:00-09:00 | [[task-one]] |
| [x] ! | Task two with a reasonably long name. | 09:00-09:30 | | [[task-two]] |
| [x] ? | Task three with a reasonably long name. | 11:00-13:00 | | [[task-three]] |
更具体地说,我有兴趣拥有与上述相同的组捕获,但我想排除表格网格(即|)。因此,$1 到 $4 组应该保持不变,但 $5 到 $7 组应该捕获文本,不包括 |,例如,如下面的选择:
您对我如何调整有任何想法,例如,组$5 的正则表达式以排除|。我无休止地尝试了各种否定(例如,[^\|])。我正在使用Oniguruma regular expressions。
【问题讨论】:
-
要获取列值,您可以:regex101.com/r/kRIonQ/1(正则表达式:
((?<=\|)[^|]*)) -
"但是
$5到$7的组应该捕获文本,不包括|" - 我认为捕获组不可能由以下序列组成不连续的字符。最好将这些捕获为额外的单独组或捕获后的后处理。 -
@DeanTaylor,我想你已经非常清楚地表达了我想要做的事情,即从一系列不连续的字符中创建一个捕获组。不幸的是,我无法进行任何后期处理,因为上面的
regex是 VSCode 中语法注入的一部分。 -
@Luuk,这看起来很有趣。如果我理解正确,您可以在排除
|的同时创建一个组。我会玩弄它的。 -
如果您使用的是打开文档搜索和替换功能中使用的正则表达式引擎,请尝试
((?<=x)\]|\[(?=x]))|((?<=\[)x(?=\]))|((?<=\[x\]\s)!(?=\s))|(?<=\[x\]\s)(\?)(?=\s)|(?<=x].*?\|)(.*?)(?=\|)。见regex101.com/r/XBFkp2/2
标签: regex visual-studio-code syntax-highlighting regex-group