假設我有以下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]] |
更具體地說,我有興趣擁有與上述相同的組捕獲,但我想排除表格網格(即|)。因此,組$1to$4應該保持不變,但是組$5to$7應該捕獲文本,不包括|,例如,如下面的選擇:

您對我如何調整有任何想法,例如,組的正則運算式$5以排除|. 我無休止地嘗試了各種否定(例如,[^\|])。我正在使用Oniguruma 正則運算式。
uj5u.com熱心網友回復:
受Wiktor回答的啟發,請查看以下很短的正則運算式
(?:\G(?<!\A)\||(?:\[x]\s[?!]?\s*\|?))\K([^|\n]*)
上面的解釋
1.\G(?!\A)\|
\G在前一個匹配的末尾或第一個匹配的字串的開頭斷言位置。負向后視(?!\A)
- \A 在字串的開頭斷言位置
- | 匹配字符 |
(?:\[x]\s[?!]?\s*\|?)
非捕獲組。匹配 [x]、\s(空格)、[?|!](零或 1)后跟 \s*(零或多個)和 | (零或一)
\K
\K 重置報告匹配的起點。
([^|\n]*)
除|之外的所有字符 或 \n (換行符)匹配先前的標記零次或無限次。
uj5u.com熱心網友回復:
您可以使用
((?<=x)]|\[(?=x]))|((?<=\[)x(?=]))|((?<=\[x]\s)!(?=\s))|(?<=\[x]\s)(\?)(?=\s)|(?:\G(?!\A)\||(?<=\[x]\s[?!\s]\s\|))\K([^|\n]*)(?=\|)
請參閱regex101 PCRE和Ruby (Onigmo/Oniguruma) 演示。
添加了什么?該(?:\G(?!\A)\||(?<=\[x]\s[?!\s]\s\|))\K([^|\n]*)(?=\|)部分:
(?:- 非捕獲組的開始(此處為自定義邊界,我們將匹配...)\G(?!\A)\|- 前一場比賽的結尾和一個|字符(即|必須緊跟前一場比賽),|(?<=\[x]\s[?!\s]\s\|)- 或緊跟在[x]空格 a之前的位置?,!或空格 空格和|字符
)- 小組結束\K- 匹配重置運算子,從整體匹配記憶體緩沖區中洗掉到目前為止匹配的文本([^|\n]*)- 除|換行符之外的零個或多個字符(?=\|)-|字符必須立即出現在當前位置的右側。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374885.html
