Rumah  >  Soal Jawab  >  teks badan

javascript - Apakah perbezaan antara ?= dan ?: dalam ungkapan biasa?

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.

天蓬老师天蓬老师2684 hari yang lalu1071

membalas semua(5)saya akan balas

  • 怪我咯

    怪我咯2017-06-15 09:24:42

    1. "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".

    2. "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,".

    3. . hasilnya ialah "123,456,78".
    4. "123456789".replace(/(d{3})(?=[^$])/g, ",");

      balas
      0
  • typecho

    typecho2017-06-15 09:24:42

    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.

    "123456789".replace(/(\d{3})(?=[^$])/g, (m, ) => `{matched=${m} =${}}`);
    // => '{matched=123 =123}{matched=456 =456}789'
    // (?=) 第一次没有消耗掉4, 第二次会从456..开始
    
    "123456789".replace(/(\d{3})(?:[^$])/g, (m, ) => `{matched=${m} =${}}`);
    // => '{matched=1234 =123}{matched=5678 =567}9'
    // (?:) 第一次消耗掉4,第二次会从567..开始

    Selain itu, watak dalam Contoh 1 [^$]是匹配一个非$ tiada kaitan dengan penghujung baris.

    balas
    0
  • 巴扎黑

    巴扎黑2017-06-15 09:24:42

    (?=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/...

    balas
    0
  • 世界只因有你

    世界只因有你2017-06-15 09:24:42

    Gunakan ()括住的是可以使用(到) untuk memadankan

    Seperti yang ditunjukkan di bawah, anda boleh menggunakan $1 untuk memadankan (menangkap) nilai yang dipadankan dalam kurungan,.

    a = '123,456';
    a.match(/\d{3}(,)/)

    Gunakan (?:)则是不捕获这一个。就是不能通过 untuk mendapatkan nilai yang diperolehi oleh kurungan

    a.match(/\d{3}(?:,)/)

    Kedua-dua nilai padanan di atas yang mengandungi ,的值
    来看下面这个,(?=)是用于匹配,但是不出现在结果里的。下面这个的结果就没有,
    Lihat yang berikut, (?=) digunakan untuk padanan, tetapi tidak muncul dalam keputusan. Tiada hasil untuk yang berikut

    a.match(/\d{3}(?=,)/)

    Hasil ketiga-tiga kod adalah seperti yang ditunjukkan dalam rajah

    Cara penulisan ini sangat berguna Terdapat beberapa kandungan yang anda tidak mahu muncul dalam keputusan, tetapi jika anda tidak menggunakannya dan padanan tidak lengkap, anda boleh menggunakan ini 🎜

    balas
    0
  • 世界只因有你

    世界只因有你2017-06-15 09:24:42

    Kedua-dua fungsi ini tidak berkaitan sama sekali
    Mod 1pattern1(?=pattern2)正向肯定断言;模式2(?:pattern3)Pengumpulan bukan penangkapan

    . Jika ya, maka ret1 ialah hasil padanan Pola 1 Jika tidak, maka ret1 bukan hasil padanan Pola 1. Sudah tentu, jika pattern1 tidak dipadankan, Corak1 juga tidak akan dipadankan.

    模式1: pattern2 本身不参与匹配,对pattern1的匹配结果(ret1)进行断言:字符串中 ret1之后的内容是否匹配pattern2?若是,则ret1为模式1匹配结果,若否,则ret1不是模式1匹配结果。当然,不匹配pattern1,则也不匹配模式1Contoh:

      var str1='abc',str2='acb';var reg=/a(?=b)/
      console.log(reg.test(str1),reg.test(str2)) //=>true false
      //因为reg.test(str1)为真,输出匹配结果
      console.log(str1.match(reg)[0])  //=>a

    2.Mod 2 digunakan terutamanya untuk membezakan

    menangkap kumpulan

    (corak4), direkodkan sebagai 模式2 主要用于区别捕获性分组(pattern4),记为模式3

    Dalam matematik, kurungan digunakan untuk melakukan operasi keutamaan; dan 模式3, selain mengasingkan kod, pattern4 mengambil bahagian dalam padanan
    dan menyimpan hasil padanan pattern4

    Untuk pengumpulan Corak 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 ?:< /code> untuk menunjukkan perbezaan. Ini mempunyai faedah yang sama seperti aksara melarikan diri .

    Contoh

    var  str='abc'
    var  reg1=/(\w)(\w)(\w)/
    var  reg2=/(\w)(?:\w)(\w)/
    //捕获了3次,RegExp.,RegExp.,RegExp....依次存储捕获结果
    var ret1=str.match(reg1)
    console.log(RegExp.,RegExp.,RegExp.)//=>a b c
    var ret2=str.match(reg2)
    //捕获了2次
    console.log(RegExp.,RegExp.) //=>a c

    @luckness memberi jawapan terperinci kepada kandungan soalan, dan saya menjawab tajuk soalan.

    balas
    0
  • Batalbalas