簡體   English   中英

匹配字符,但不匹配

[英]Match character but not when preceded by

我想替換所有換行符,但前提是不要在換行符之前沒有使用JavaScript的這兩個字符{] (兩者都不是其中之一)。 以下表達式似乎可以完成任務,但是它破壞了其他正則表達式結果,因此一定有問題:

/[^\{\]]\n/g

我究竟做錯了什么?

當使用[^\\{\\]] ,使用的是字符范圍:這表示“不是\\{\\]任何字符。這意味着匹配將在{\\n}\\n上失敗。

如果要否定一個字符長於一個字符的圖形,則需要否定的前瞻:

/^(?!.*{]\n)([^\n]*)\n/mg

^(?!          # from the beginning of the line (thanks to the m flag)
    .*{]\n    # negative lookahead condition: the line doesn't end with {]\n
)
([^\n]*)      # select, in capturing group 1, everything up to the line break
\n

並替換為

$1 + replacement_for_\n

我們要做的是逐行檢查我們的行是否沒有多余的模式。

如果不是,我們在捕獲組1中選擇直到結尾\\n所有內容,並用所有內容替換整行,然后是要替換\\n的內容。

演示: http//regex101.com/r/nM2xE1

您是否需要去除\\n\\r\\n或同時去除兩者?

這應該做的工作:

/(^|^.|[^{].|.[^\]])\r?\n/gm

並要求您在替換字符串的開頭放置$1

要回答有關/[^\\{\\]]\\n/錯誤的問題,此正則表達式等於:“匹配既不是{也不是]任何字符”,后跟\\n ,因此這不正確地無法匹配以下內容:

here's a square]\n
see the following{\n

您最后也缺少g標志,但是您可能已經注意到了。

不支持向后看,您可以通過這種方式進行模仿

stringWhereToReplaceNewlines.replace(/(.{0,2})\n/g, function(_, behind) {
  return (behind || "") + ((behind === '{]') ? "\n" : "NEWLINE_REPLACE")
})

對於每個“ \\ n”,將使用前面的2個字符作為第二個參數來調用回調。 回調必須返回替換“ \\ n”和前面兩個字符的字符串。 如果前兩個字符為“ {]”,則不應替換新行,因此我們將返回完全相同的字符串,否則,將返回前兩個字符(可能為空)以及應替換換行的內容

我的解決方案是這樣的:

([^{].|.[^\]])\n

您的替換字符串應為$1<replacement>

由於JavaScript不支持先行搜索,因此我們必須先行完成。 正則表達式的工作方式如下:

  • {所有內容- [^{].
  • 或除.[^\\]] ]其他任何東西- .[^\\]]
  • 簡而言之, [^{].|.[^\\]]匹配..匹配的所有內容,除了{]
  • 最后一個\\n

\\n之前的兩個字符被捕獲,因此您可以使用$1它們重新插入替換字符串中。

暫無
暫無

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

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