我正在嘗試使用 javascript 中的正則運算式匹配降價標頭。降價標頭是一個字串,以一個或多個#開頭,后跟一個或多個空格和一些文本,如下所示:
## This is the title
棘手的是,我得到了一個多行字串和一個 0 索引的起始位置,我需要檢查從給定位置開始的字串是否以 markdown 標題開頭。換句話說,我需要撰寫以下函式:
/**
* The function should return true in the following situations:
* - text: "abc\n# My Title", startPos = 4
* - text: "abc\n# My Title\nxyz", startPos = 4
*
* The function should return false in the following situation:
* - text "abc\n#My Title", startPos = 0
*/
function isMarkdownHeader(text, startPos) {
...
}
這是我嘗試過的:
function isMarkdownHeader(text, startPos) {
const pattern = new RegExp(`^[^]{${startPos}}(^# )(\\s )(.*$)`, 'm');
return pattern.exec(text) != null;
}
console.log(isMarkdownHeader("abc\n## My Title\nxyz", 4)); // true
console.log(isMarkdownHeader("abc\n## My Title\nxyz", 0)); // true, which is incorrect.
該函式應false在第二次呼叫中回傳。但它沒有。為什么?我怎樣才能讓它作業?
uj5u.com熱心網友回復:
使用正則運算式的解決方案
您可以使用
^.{4}(# \s .*)
功能看起來
function isMarkdownHeader(text, startPos) {
const pattern = new RegExp(`^.{${startPos}}# \\s .*`, "s");
return pattern.exec(text) != null;
}
isMarkdownHeader("abc\n## My Title\nxyz", 4) // true
isMarkdownHeader("abc\n## My Title\nxyz", 0) // false
注意:這里我使用了s標志。另外,請參閱演示。
使用 Slice 的解決方案
您可以在檢查有效性之前對輸入字串進行切片。
function isMarkdownHeader(text, startPos) {
const pattern = /^# \s .*/;
return !!pattern.exec(text.slice(startPos));
}
isMarkdownHeader("abc\n## My Title\nxyz", 4) // true
isMarkdownHeader("abc\n## My Title\nxyz", 0) // false
編輯
isMarkdownHeader("abcd## My Title\nxyz", 4)應該回傳false。使用您的代碼,回傳值為true
發生這種情況是因為稱為換行符和\n字符的東西不是一回事。\nin a string 是換行符的常規字符,在我們列印字串后它變成換行符。因此,如果您想同時匹配它們,請使用
^.{4}(?:^|\n|\\n)(# \s .*)
在這里,我將(?:^|\n|\\n)模式添加到舊的
(?:非捕獲組^|\n|\\n匹配字串或換行符或\n字符的開頭
)關閉非捕獲組
它匹配
abcd\n## My Title\nxyzabcd?## My Title\nxyz?換行符在哪里
它不匹配
abcd## My Title\nxyz
PS 對于匹配abc\n## My Title\nxyz,您必須3用作startPos,不包括\n字符。
function isMarkdownHeader(text, startPos) {
const pattern = new RegExp(`^.{${startPos}}(?:^|\\n|\\\\n)(# \\s .*)`, "s");
return pattern.exec(text) != null;
}
console.log(isMarkdownHeader("abc\n## My Title\nxyz", 3)) // true
console.log(isMarkdownHeader("abc\n## My Title\nxyz", 0)) // false
console.log(isMarkdownHeader("abcd## My Title\nxyz", 4)) // false
uj5u.com熱心網友回復:
根據Regex101,{0}量詞導致前一個標記被忽略。沒有參考支持這一點,但我會相信他們的話。
既然如此,您可以檢查您的匹配是否從索引 0 開始(這表明字串以正確數量的忽略字符開頭)。
function isMarkdownHeader(text, startPos) {
const pattern = new RegExp(`^[^]{${startPos}}(^# )(\\s )(.*$)`, 'm');
const match = pattern.exec(text);
return match?.index === 0;
}
console.log(isMarkdownHeader("abc\n## My Title\nxyz", 4)); // true
console.log(isMarkdownHeader("abc\n## My Title\nxyz", 0)); // now false
uj5u.com熱心網友回復:
您不需要正則運算式從某個位置開始。您可以只傳遞從以下位置開始的子字串startPos:
return pattern.exec(text.substring(startPos)) != null;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485683.html
標籤:javascript 正则表达式
