2016-03-21 14 views
0

içerim daha önce oldukça benzer bir soru sordu ve bu regex uygulamaya ondalık sayılar "x", "^", "(", "24", "-", "3", "x", ")"her karakter yarmaya ama tutarak sayılar için Regex ve birlikte

Şimdi bir String'i aynı koşullarda ayırmam gerek, ondalık sayıları bir arada tutmam gerekiyor. ATM, (0.5) gibi bir girdi: "(", "0", ".", "5", ")" ama bir string gibi gruplanmış kalmak için ondalık sayıya ihtiyacım var: "(", "0.5", ")". [0-9]+|[a-z]+|[()^*/+-] gibi örnek bir şeye, yani bir veya daha fazla sayı için, sen jeton arasında

+0

yerine kayma, neden '\ d + gibi bir şey aramayın | \ w +: Ayrıca çoklu karakter operatörleri varsa, bu tür != veya <= olarak, başka bir ayrılmalara bu değişebilir + - * /] '? –

+0

Birinden bir cevap alabilirsiniz ... ama yanlış yere baktığınız için çok güçlü bir his var. Daha sonra, iç içe köşeli parantez vb. Ile değerlendirmek isterseniz, bunu normalden ziyade düzgün dilbilgisi ayrıştırıcısıyla yapıyor olmalısınız. Başlangıçta biraz daha fazla iş, ama çok yakında ödeme yapar ve gelecekteki gereksinimleri karşılamak için izin verecektir –

+0

@ ArturBiesiadowski, regex bir dilbilgisi ayrıştırıcı için bir giriş akışı belirtmek için mükemmel geçerli bir yoldur. Her şeyden sonra eski 'lex' iyi işler. –

cevap

2

yerine bölme, oldukça kolay birkaç farklı belirteçleri eşleşen bir regex tanımlayabiliriz ederiz veya tane daha fazla harf veya herhangi tek özel karakter. Pratikte, bu biraz daha fazla ayrıntı gerektirebilir, örn. ondalık sayılar hesabını: isteğe bağlı olarak bir nokta ve daha izledi

  • (\\d+(\\.\\d+)?) Bazı rakam,:

    List<String> tokens = new ArrayList<>(); 
    Pattern p = Pattern.compile("(\\d+(\\.\\d+)?)|[a-zA-Z]+|[()^*/+-]"); 
    Matcher m = p.matcher("exp(42) * x^(24-3x) - 3.14"); 
    while (m.find()) { 
        tokens.add(m.group()); 
    } 
    

    Sonucu tokens için regex bileşenlerine daha yakından bakmak alarak [exp, (, 42,), *, x, ^, (, 24, -, 3, x,), -, 3.14]

    olduğunu basamak. Ayrıca, .1 veya 42. gibi sayılara izin vermek istiyorsanız, bunu biraz değiştirmeniz gerekir.

  • [a-zA-Z]+ Bir veya daha fazla harf; var_23 gibi alt çizgi veya basamaklı değişkenlere izin vermek istiyorsanız, bunu ([a-zA-Z_]\w+) (test edilmemiş) gibi bir şeye genişletebilirsiniz.
  • [()^*/+-] İşlem veya destek gibi tek bir özel karakter. -'un son geldiğini ve bir aralık olarak yorumlanmadığını unutmayın.) ([^ | +|-|==|<=|...
+0

Ondalıklardan ne haber? Örneğimde, 0,5 hala "0", "." Olarak ayrılmıştır. , "5" ' – Zi1mann

+0

Bu cevap ondalıkları hesaba katar. –

+0

@ Zi1mann Artık ondalık için bir şey ekledim. Örneğe bakınız. –

İlgili konular