簡體   English   中英

正則表達式替換不正確刪除字符

[英]Regex replace not removing characters properly

我有正則表達式:

const regex = /^\d*\.?\d{0,2}$/

及其逆(我相信)

const inverse = /^(?!\d*\.?\d{0,2}$)/

第一個正則表達式驗證字符串適合任何正數,允許一個小數和兩個小數(例如15014.7.412.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.

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