Pertama-tama, ada banyak sekali pertanyaan tentang regex pada ekspresi matematika, jika saya mengabaikan salah satu yang sudah menjawab ini, maaf. Meskipun ini berasal dari penguraian ekspresi matematika (tidak eval...), ini lebih tentang "tidak bisakah ini dilakukan dengan satu regex rumit atau serupa?".

Apakah ada cara untuk membagi string yang berisi ekspresi matematika seperti "-5.42+2--3*-5.5/-2+-4" menjadi ["-5.42", "+", "2", "-", "-3", "*", "-5.5", "/", "-2", "+", "-4"] dalam satu .split[1]? Kata lain, pisahkan operator biner (/[+*/]|(?<!^|[+\-*/])-/, yang melihat ke belakang adalah masalahnya) dan argumennya (/-?\d+(\.\d+)?/). Unary minus muncul paling banyak sekali per angka, alias no ---. Tidak ada kawat gigi pada langkah ini.

Cara saya melihatnya, tanpa melihat ke belakang, tidak mungkin untuk membedakan unary - dari biner - dengan batasan split (jawaban yang diharapkan). Namun, mungkin ada trik untuk mendapatkan hasil yang sama tanpa melihat ke belakang. Saya terlalu sering dikejutkan oleh solusi regex yang rumit untuk mempercayai intuisi saya.

Dengan beberapa operasi, berikut adalah salah satu cara dari banyak cara (perhatikan bahwa penggantian regex pertama agak mengemulasi tampilan di belakang):

console.log("-5.42+2--3*-5.5/-2+-4"
  .replace(/^-|([+\-*/])-/g, "$1#")
  .split(/([+\-*/])/)
  .map(e => e.replace("#", "-"))
);

Alternatif lain adalah membalikkan string, lalu menggunakan lookahead sebagai gantinya dan membalikkan hasilnya lagi.

[1] Saya akan menambahkan (or operation) di sini tetapi pertanyaan tentang apa itu "operasi" akan segera muncul dan benar-benar menggagalkan topik. Demikian pula akan (or in a beautiful way) sebagai berbasis opini. Namun, saya pikir mis. tentang menggunakan pencocokan tanda kurung berulang yang tidak mungkin dilakukan dalam javascript tetapi akan sangat mirip dengan split.

3
ASDFGerte 16 Agustus 2017, 20:33

2 jawaban

Jawaban Terbaik

Jawaban singkat:

Anda tidak dapat melakukan apa yang Anda inginkan hanya dengan Regex. Anda harus menggunakan Tata bahasa ekspresi parsing (PEG)

Jawaban panjang

Dari apa yang Anda lihat, ekspresi matematika hanya berisi terms dan operators. Tetapi pada kenyataannya, ini lebih kompleks dari itu. Karena kombinasi term dan operator tertentu akan memiliki prioritas lebih tinggi daripada yang lain. Jadi yang harus kita perhatikan bukan hanya term dan operator, tetapi sesuatu seperti:

  1. Pertama kita deklarasikan a term = a number or an expression
  2. Maka kita memiliki an unary = positive value or negative value of a term
  3. Maka kita memiliki a multiple = an unary [multiply or divide to another unary]{0 times or more}
  4. Maka kita memiliki a sum = a multiple [add or subtract to another multiple]{0 times or more}
  5. Akhirnya, an expression = a sum

Ini adalah deklarasi untuk ekspresi + - * / saja. Ekspresi yang lebih kompleks yang berisi parenthese, and operator, or operator dll akan memiliki deklarasi yang lebih kompleks. Dan Anda tidak punya pilihan selain menggunakan PEG.

Jadi, coba PEGjs di sini. Ini memiliki demo bagaimana ekspresi sederhana seperti "2 * (3 + 4)" diimplementasikan.

Dan tentu saja Anda dapat mengekstrak apa pun yang Anda inginkan dari sebuah ekspresi.

1
trgiangvp3 16 Agustus 2017, 18:20

Apa yang salah dengan pemisahan pada operator?

.split(/(?=[-+*/()])/);
-3
NetMage 16 Agustus 2017, 18:06