2016-04-12 32 views
0

İki küme parantez içine alınmış tüm verileri okumaya çalışın. Regex'im başarısız olduğundan şüpheleniyorum çünkü yeni satırlarla eşleşemiyor. Bağlantı go oyun alanında kaynak: http://play.golang.org/p/uNjd01CL8Zİki parantez arasındaki tüm verileri yakalayın

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    x := ` 
lease { 
    interface "eth0"; 
    fixed-address 10.11.0.1; 
    option subnet-mask 255.255.0.0; 
} 
lease { 
    interface "eth0"; 
    fixed-address 10.11.0.2; 
    option subnet-mask 255.255.0.0; 
} 
lease { 
    interface "eth0"; 
    fixed-address 10.11.0.2; 
    option subnet-mask 255.255.0.0; 
}` 

    re := regexp.MustCompile(`{(.+)?}`) 
    fmt.Println(re.FindAllString(x, -1)) 

} 
+0

Olabilir muhtemelen istiyorum kullanım '\ {(*.?) \}':

İşte Git normal ifadeler için kullanılan düzenli ifade sözdizimi belgelerine bağlantı. –

+0

@CPanda İpucu'nuz çalışmıyor. Regex'imle ilgili hata, yeni satırlarla eşleşmemesidir. Tonisuter çalışmaları tarafından verilen çözüm. – linuxfan

+1

Ayrıca kullanabilirsiniz: re: regexp.MustCompile (\ '{[\ s \ S] *?} \') ' –

cevap

1

İşte çözüm:

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    x := ` 
lease { 
    interface "eth0"; 
    fixed-address 10.11.0.1; 
    option subnet-mask 255.255.0.0; 
} 
lease { 
    interface "eth0"; 
    fixed-address 10.11.0.2; 
    option subnet-mask 255.255.0.0; 
} 
lease { 
    interface "eth0"; 
    fixed-address 10.11.0.2; 
    option subnet-mask 255.255.0.0; 
}` 

    re := regexp.MustCompile(`(?s){.*?}`) 
    fmt.Println(re.FindAllString(x, -1)) 
} 

İki şey değişti. (?s) bayrağı, . joker karakterleriyle olduğu gibi yeni satırlarla da eşleşeceği anlamına gelir. Ve .*?, bunun yerine parantezler arasında daha az sayıda karakterle eşleşeceğini gösterir. .* kullanırsanız, bunun yerine dış parantez çiftiyle eşleşir. https://github.com/google/re2/wiki/Syntax

+1

Sağdan @tonisuter. Teşekkürler – linuxfan

İlgili konular