Hanya pergi ke contoh: tambah koma antara setiap tiga nombor
"123456789".replace(/(\d{3})(?:[^$])/g, ",");
//"123,567,9"
"123456789".replace(/(\d{3})(?=[^$])/g, ",");
//"123,456,789"
Contoh lain yang muncul dalam forum sebelumnya ialah menambah koma di antara setiap tiga nombor
先看看 (?=pattern) 的使用,下面这个是正确的:
function groupByCommas(n) {
return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
console.log(groupByCommas(1234567)); //1,234,567
如果我们把 ?= 换成 ?: 的话:
function groupByCommas(n) {
return n.toString().replace(/\B(?:(\d{3})+(?!\d))/g, ",");
}
console.log(groupByCommas(1234567)); //1,
Tidak perlu menyatakan konsep kedua-duanya, saya menemui jawapan yang mengatakan: Perbezaannya ialah ?= ialah pernyataan positif yang positif, dan padanan tidak menduduki panjang pertanyaan manakala ?: ialah padanan bukan pemerolehan, dan padanan itu menduduki panjang pertanyaan .
Tetapi saya masih tidak begitu memahami pernyataan bahawa pertanyaan menempati panjang di sini Jelaskan kepada contoh Adakah ini bermakna contoh pertama (?=[^$]) sepadan dengan tidak berakhir, jadi panjang minimum bukan berakhir selepas 123 ialah 1 aksara, jadi 4 digantikan bersama? Jadi mengapa tidak menggantikannya terus hingga akhir? Contoh kedua (?=(d{3})+(?!d)) sepadan dengan 3 atau gandaan 3, dan padan terus ke penghujung, jadi 234567 juga diganti terus? Jadi pemahaman saya pasti salah
Saya tidak memahaminya dengan teliti Saya mengalu-alukan anda untuk menjawab kekeliruan saya dengan contoh.
"123456789".replace(/(d{3})(?:[^$])/g, ",");
()
表示捕获型括号,(?:)
表示非捕获型括号,所以第一个括号匹配的内容会放在中,第二个括号匹配的内容不会放在中。
d{3}
表示连续三个数字,[^$]
表示匹配一个字符,只要这个字符不是$符号,需要注意的是[]
表示匹配里面的任意一个字符,但是肯定是要有一个的,所以[]
匹配出来的字符的长度肯定是1,不存在0的情况,另外在[$]
里面的$符号是没有特殊含义的,就是$这个字符,而不是匹配字符串的结尾。因为
d{3}
匹配三个字符,[^$]
匹配一个字符,所以这个正则匹配4个字符;来看匹配过程,首先"1234"是满足的,"123"匹配d{3}
,"4"匹配[^$]
,此时="123"
,所以"1234"被替换成"123,"。然后从5开始下次匹配,类似的"5678"满足条件,="567"
, jadi "5678" digantikan dengan "567,". Kemudian padanan bermula dari 9. Tiada padanan di bawah Padanan berakhir dan hasilnya ialah "123,567,9"."1234567".replace(/B(?:(d{3})+(?!d))/g, ",");
B
匹配非单词边界,也是一个位置,没有宽度,(d{3})+
匹配3的倍数数字序列,且个数至少是3个,+
是量词,表示1到多次,默认是贪婪的,贪婪就是尽可能多的匹配,(?!d)表示这个位置后面不是数字。看例子,首先
B
不匹配行首,所以匹配的位置移动到"1"后面的位置,此时B
匹配1后面的位置,然后"234", "567"匹配d{3},因为是贪婪匹配,所以(d{3})+匹配"234567",然后因为7后面是字符串的结尾了,所以满足断言(?!d)
不是数字,所以整个正则的匹配结果是"234567",所以"234567"被替换成了","
. 1 tidak bergerak, jadi "1234567" menjadi "1,"."123456789".replace(/(d{3})(?=[^$])/g, ",");
Diduduki atau "dimakan" bermaksud sama ada bahagian yang dipadankan boleh dipadankan dengan ungkapan biasa yang lain (penegasan kemudian, atau masa
/ /g
seterusnya). Jika ia "dimakan", ia tidak boleh dipadankan lagi.Selain itu, watak dalam Contoh 1
[^$]
是匹配一个非$
tiada kaitan dengan penghujung baris.(?=456)
匹配一个位置,这个位置后面跟了456
。比如
123(?=456)
会匹配123456
中的123
,而不会匹配123457
中的123
,不占用的意思是,至匹配123
后面的456
并不会被占用掉。123456
匹配的是123456
, 而123(?=456)456
同样匹配123456
后面加了(?=456)
Sebenarnya tidak masuk akal.Anda boleh menggunakan kurungan untuk menukar keutamaan, dsb. dalam ungkapan biasa Selain itu, untuk bahagian dalam kurungan, nombor akan diberikan secara berperingkat dari kiri ke kanan Anda boleh menggunakan nombor itu untuk merujuk teks yang dipadankan dengan bahagian ini kemudian. Dalam JS
replace
里,替换的部分可以用之类的引用这一部分的匹配。
比如
(a)1
会匹配两个连续的a,([A-Z])1
匹配两个连续相同的大小字母,(A-Z)1([a-z])2
padankan dua huruf besar dan huruf kecil berturut-turut, diikuti dengan dua huruf kecil berturut-turut (huruf besar dan huruf kecil boleh berbeza).Kadang-kadang, kita hanya mahu menukar keutamaan dan tidak mahu memberikan nombor (jarang digunakan), gunakan sahaja
(?:)
比如
(a)(?:b)(c)12
匹配abcac
,但是(a)(b)(c)12
匹配abcab
.http://zonxin.github.io/post/...
Gunakan
()
括住的是可以使用(到)
untuk memadankanSeperti yang ditunjukkan di bawah, anda boleh menggunakan $1 untuk memadankan (menangkap) nilai yang dipadankan dalam kurungan
,
.Gunakan
(?:)
则是不捕获这一个。就是不能通过untuk mendapatkan nilai yang diperolehi oleh kurungan
Kedua-dua nilai padanan di atas yang mengandungi
,
的值来看下面这个,
(?=)
是用于匹配,但是不出现在结果里的。下面这个的结果就没有,
Lihat yang berikut,
(?=)
digunakan untuk padanan, tetapi tidak muncul dalam keputusan. Tiada hasil untuk yang berikutKedua-dua fungsi ini tidak berkaitan sama sekali
. Jika ya, maka ret1 ialah hasil padananMod 1
pattern1(?=pattern2)
正向肯定断言;模式2(?:pattern3)
Pengumpulan bukan penangkapanPola 1
Jika tidak, maka ret1 bukan hasil padananPola 1
. Sudah tentu, jika pattern1 tidak dipadankan,Corak1
juga tidak akan dipadankan.模式1
: pattern2 本身不参与匹配,对pattern1的匹配结果(ret1)进行断言:字符串中 ret1之后的内容是否匹配pattern2?若是,则ret1为模式1
匹配结果,若否,则ret1不是模式1
匹配结果。当然,不匹配pattern1,则也不匹配模式1
Contoh:2.Mod 2 digunakan terutamanya untuk membezakan
menangkap kumpulan模式2
主要用于区别捕获性分组(pattern4)
,记为模式3
Dalam matematik, kurungan digunakan untuk melakukan operasi keutamaan; dan
模式3
, selain mengasingkan kod, pattern4 mengambil bahagian dalam padanandan menyimpan hasil padanan pattern4
Untuk pengumpulanCorak 2 bukan penangkapan (?:pattern3), ini bermakna hasil pattern3 tidak akan disimpan, tetapi pattern3 itu sendiri
模式2
(?:pattern3)的非捕获性分组,则表示不会对pattern3的结果进行存储,但本身pattern3参与了匹配,主要用于对代码进行隔离。也就是要表现
()
本来的意义,而()
在正则表达式中有了捕获性分组的定义,于是增加一个
?:
以示区别。这和转义符mengambil bahagian dalam pemadanan dan digunakan terutamanya untuk mengasingkan kod. Iaitu untuk menyatakan maksud asal
()
, dan()
mempunyai takrifan menangkap kumpulan dalam ungkapan biasa, jadi?: untuk menunjukkan perbezaan. Ini mempunyai faedah yang sama seperti aksara melarikan diri
.
Contoh
@luckness memberi jawapan terperinci kepada kandungan soalan, dan saya menjawab tajuk soalan.