簡體   English   中英

從字符串中刪除字符的最后一個實例-Javascript-重新審視

[英]Remove Last Instance Of Character From String - Javascript - Revisited

根據這個問題的公認答案,以下是從字符串中刪除某個字符的最后一個實例的語法(在這種情況下,我想刪除最后一個& ):

 function remove (string) { string = string.replace(/&([^&]*)$/, '$1'); return string; } console.log(remove("height=74&width=12&")); 

但是我試圖完全理解它為什么起作用。

根據regex101.com,

/&([^&]*)$/

&匹配字符&按字面意義(區分大小寫)

第一捕獲組([^&]*)匹配[^&]*下面的列表中不存在的單個字符

*量詞-在零和無限制的時間之間進行匹配,並盡可能多地匹配,並根據需要返回(貪婪)

&匹配字符&按字面意義(區分大小寫)

$聲明位置在字符串末尾,或者在行終止符之前在字符串末尾(如果有)

因此,如果我們將字符&從字面上與第一個&相匹配:

在此處輸入圖片說明

那為什么我們還要“匹配以下列表中存在的單個字符”?

在此處輸入圖片說明

似乎適得其反。

然后,“ $聲明字符串末尾的位置”-這是什么意思? 它首先從字符串的后面開始搜索匹配項嗎?

最后, $1在replaceValue中的作用是什么? 為什么用$1代替空字符串? ""

1-我認為該問題的解決方案與您想要的解決方案不同:

無論在字符串的中間還是結尾,該正則表達式都將替換最后一個“&”。

如果將此正則表達式應用於這兩個示例,您將看到第一個被“錯誤地”替換:

height=74&width=12&test=1
height=74&width=12&test=1&

它們被替換為:

height=74&width=12test=1
height=74&width=12&test=1

因此,要真正替換最后一個“&”,您唯一需要做的就是:

string.replace(/&$/, '');

現在,如果您想替換“&”的最后一次出現,無論它在哪里,我都會解釋一下regex:

$ 1代表一個(捕獲組),那些([^&] *)中的所有內容都被捕獲在該$ 1中。 這太簡單了。

&([^&]*)$

&將匹配文字“&”,然后在以下捕獲組中,此正則表達式將查找任意數量(0到無窮大)的字符(不等於“&”,后面解釋),直到字符串或行的末尾(取決於您在正則表達式中使用的標志/ m 用於匹配行 )。 應用替換后,此捕獲組中捕獲的所有內容將變為$ 1。

因此,如果您將這種邏輯應用到您的腦海中,您將看到它總是與最后一個&匹配,並用右邊的任何不包含單個“&”的東西替換它

&(<nothing-like-a-&>*)<until-we-reach-the-end> replaced by anything found inside (<nothing-like-a-&>*) == $1. In this case because of the use of * , it means 0 or more times, sometimes the capturing group $1 will be empty.


與部分不相等:正則表達式使用[^],簡單來說[]代表一組獨立字符,例如:[ab]或[ba]代表相同字符,它將始終查找“ a”或“ b” 。 在其中,您還可以像[0-9ba]這樣查找范圍為0到9的值,它將始終匹配0到9,a或b的任何值。

[^]此處的“ ^”表示內容的取反,因此,它將匹配該組中不存在的任何內容,例如[^ 0-9]將始終匹配不包含數字的任何內容。 在您的正則表達式[^&]中,它用於查找不是“&”的任何內容

暫無
暫無

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

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