[英]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.