此正則運算式通過第一個字母匹配第二個字母,但第二個字母不是大寫
([a-z])\1
現在正則運算式匹配 aa 或 bb 之類的字母,...但我需要我的正則運算式可以匹配此字串“abc aAcv bBkl mM”中的所有 aA、bB、...
那么如何使該正則運算式可以通過第一個值匹配第二個值,但第二個必須是大寫
uj5u.com熱心網友回復:
您可以通過[a-z]\1以小寫模式匹配所有內容然后檢查每個匹配項是否也匹配來表達這一點[a-z][a-Z]:
var input = "abcaAcvbBklmMzzQQ";
var matches = input.match(/([a-z])\1/gi)
.filter(x => /^[a-z][A-Z]$/.test(x));
console.log(matches);
uj5u.com熱心網友回復:
這很丑,但如果你必須使用一個簡單的正則運算式,你可以暴力破解全套配對:
var myText = "aAaaABbCCddEEeEfF";
var letterPairs = myText.match(/aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ/g);
console.log(letterPairs);
作為一個解決方案,它感覺不是很令人滿意,但它會完成作業。
uj5u.com熱心網友回復:
我認為你不能只用一個 JavaScript 正則運算式來做到這一點(好吧,除非你列出所有可能的組合)。其他一些環境中的正則運算式可能能夠做到這一點,但不是 JavaScript。
但是,匹配一個小寫字符后跟一個大寫字符然后過濾掉一個不是另一個小寫等效字符的字符是相當簡單的:
const str = "abcaAcvbBklmM";
const results = [];
for (const [, lower, upper] of str.matchAll(/([a-z])([A-Z])/g)) {
if (lower === upper.toLocaleLowerCase()) {
results.push(lower upper);
}
}
console.log(results);
這是如何作業的:
- 正則運算式
/([a-z])([A-Z])/g匹配一個小寫字母后跟一個大寫字母(但它們不一定是“相同的”字母),在捕獲組中捕獲每個字母。 matchAll匹配字串中所有出現的那個,回傳結果的迭代器。for-of回圈遍歷迭代器的結果。結果matchAll是一個擴充陣列,其中陣列中的第一個元素是整體匹配,然后是任何捕獲組的元素。該代碼在 中使用解構for-of來挑選出陣列的第二個和第三個元素(兩個捕獲組)。- 如果第一個字母與轉換為小寫的第二個字母匹配,則它是匹配的,我們會保留它。
我們也可以使用陣列方法而不是單個方法通過多次傳遞來做到這一點for-of:
const str = "abcaAcvbBklmM";
const results = [...str.matchAll(/([a-z])([A-Z])/g)]
.filter(([, lower, upper]) => lower === upper.toLocaleLowerCase())
.map(([match]) => match);
console.log(results);
1 這段代碼沒有使用陣列的增強部分,但基本上它除了是一個陣列之外,它還有一個index屬性說明匹配發生的位置,一個groups包含捕獲組資訊的屬性(我們可以使用它,但它就像易于使用這個簡單的正則運算式的陣列元素),以及input帶有原始字串的屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477632.html
標籤:javascript 正则表达式
下一篇:如何將鍵值移動到物件內的新陣列中
