[英]Regex replace not removing characters properly
我有正則表達式:
const regex = /^\d*\.?\d{0,2}$/
及其逆(我相信)
const inverse = /^(?!\d*\.?\d{0,2}$)/
第一個正則表達式驗證字符串適合任何正數,允許一個小數和兩個小數(例如150
、 14.
、 7.4
、 12.68
)。 第二個正則表達式與第一個正則表達式相反,並且做一些測試我非常有信心它給出了預期的結果,因為它只驗證字符串何時不是可能有小數點和兩位數的數字(例如12..05
54.357
a5
。
我的目標是從字符串中刪除任何不適合第一個正則表達式的字符。 我以為我可以這樣做:
let myString = '123M.45';
let fixed = myString.replace(inverse, '');
但這並不像預期的那樣工作。 為了調試,我嘗試將替換字符更改為我能夠看到的內容:
let fixed = myString.replace(inverse, 'ZZZ');
當我這樣做時, fixed
變為: ZZZ123M.45
任何幫助將不勝感激。
我想我理解你在這里的邏輯,試圖找到一個正則表達式,它是與你的有效字符串匹配的正則表達式的反面,希望它能讓你刪除任何使你的字符串無效的字符,只留下有效的字符串。 但是,我認為replace()
不會讓您以這種方式解決問題。 來自MDN 文檔:
replace()方法返回一個新字符串,其中部分或所有模式匹配被替換。
在您的inverse
模式中,您使用的是負面前瞻。 如果我們以X(?!Y)
為例,我們可以將其視為“如果后面沒有 Y,則匹配 X”。 在您的模式中,您的“X”是^
而您的“Y”是\d*\.?\d{0,2}$
。 根據我的理解,你得到ZZZ123M.45
的原因是它找到了你的模式\d*\.?\d{0,2}$
后面沒有的第一個^
(即字符串的開頭) ,並且由於123M.45
與您的“Y”模式不匹配,您的否定前瞻得到滿足並且字符串的開頭被匹配並“替換”為 ZZZ。
那(我認為)是對您所看到的內容的解釋。
我會為您的問題提出一個替代解決方案,該解決方案更符合我對.replace()
方法的理解。 而不是你的inverse
模式,試試這個:
const invalidChars = /[^\d\.]|\.(?=\.)|(?<=\.\d\d)\d*/g
const myString = '123M..456444';
const fixed = myString.replace(invalidChars, '');
在這里,我使用了一種模式,我認為它會匹配您要刪除的單個字符。 讓我們分解一下這個在做什么:
[^\d\.]
:匹配不是數字的字符
\.(?=\.)
:匹配.
字符,如果它后面跟着另一個.
特點。
(?<=\.\d\d)\d*
:匹配前面有小數點和 2 位數字的數字
然后我將所有這些與 OR ( |
) 連接起來,因此它會匹配上述任何一個模式,並且我使用g
標志以便它會替換所有匹配項,而不僅僅是第一個匹配項。
我不確定這是否會涵蓋您的所有用例,但我想我會試一試。 這是一個可能比我的更有幫助的細分鏈接,如果需要,您可以使用此工具調整模式。
我認為你做不到
從字符串中刪除不適合第一個正則表達式的任何字符
因為正則表達式匹配是針對整個字符串的,而replace
用於僅替換該字符串中的一部分。 所以replace
里面的 Regex 必須是一個 Regex 來只匹配不需要的字符,而不是倒置的 Regex。
您可以做的是使用原始regex
驗證字符串,然后如果它無效,請重新替換並驗證。
//if (notValid), replace unwanted character // replace everything that's not a dot or digit const replaceRegex = /[^\d.]/g; // notice g flag here to match every occurrence const myString = '123M.45'; const fixed = myString.replace(replaceRegex, ''); console.log(fixed) // validate again
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.