簡體   English   中英

是否不可能在 JavaScript 中使用多行正則表達式模式指示輸入字符串的開頭?

[英]Is it impossible to indicate the start of the input string using a multiline regex pattern in JavaScript?

在 JavaScript 中, 多行標志改變了^$的含義:

將開始和結束字符(^ 和 $)視為在多行上工作(即匹配每行的開頭或結尾(以 \\n 或 \\r 分隔),而不僅僅是整個輸入字符串的開頭或結尾)

那么,這些字符不在圖片中,還有其他方法可以標記輸入字符串的開頭嗎? 如何指示我希望我的多行模式在輸入字符串的開頭匹配?

我知道我可以使用exec返回值的index屬性檢查匹配的index ,但是有沒有辦法阻止正則表達式引擎首先搜索整個字符串?

不, ^是測試輸入開始的唯一內置斷言,正如您所說,它的行為由multiline標志修改。

您可以在要測試的字符串的開頭以及正則表達式的開頭放置一些唯一的字符串,但這有點小技巧。 在正常情況下,如您所說,您將測試返回匹配項的索引。

不,JavaScript 不像大多數其他風格那樣支持絕對錨點( \\A\\Z\\z )。 但是你確定你需要它們嗎? 字符串的開頭通常是唯一必須使用錨點的地方。 每個后續行都被它前面的換行符自動“錨定”。

我建議您刪除多行標志並確保您明確使用所有換行符。 我知道這有點含糊; 如果您要提供代碼示例和/或告訴我們您要解決的問題,我們可能會做得更好。

2021 年,隨着支持RegExp的后視構造的 ECMAScript 2018+ 標准的日益普及,您現在可以在多行模式正則表達式中使用“絕對”、明確的字符串位置開始,如果您使用

/^(?<![^])/gm

盡管g標志允許多重匹配並且m允許^匹配任何行的起始位置,但^(?<![^])模式只匹配

  • ^ - 一行的開始
  • (?<![^]) - 它的左邊沒有字符。 [^]匹配 ECMAScript 正則表達式中的任何字符。

替代品

/^(?<![\w\W])/gm
/^(?<!.)/gsm

其中[\\w\\W]匹配任何字符,包括換行符( [\\s\\S][\\d\\D]的同義結構),並且/s標志使. 斷線意識。

請參閱 JavaScript 演示:

 const regex = /^(?<![^])/gm; // g - multiple matching enabled! const text = 'Line 1\\nLine 2\\nLine 3'; console.log(text.replace(regex, 'INSERTION...')); // Only the first line affected // => INSERTION...Line 1 // Line 2 // Line 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM