Pemadanan Corak dalam Rentetan di Groovy

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat ciri bahasa Groovy untuk pemadanan corak dalam Strings.

Kita akan melihat bagaimana pendekatan termasuk bateri Groovy memberi kita sintaks yang kuat dan ergonomik untuk keperluan pemadanan corak asas kita.

2. Pengendali Corak

Bahasa Groovy memperkenalkan pengendali corak yang disebut ~ . Pengendali ini boleh dianggap sebagai jalan pintas gula sintaksis ke kaedah java.util.regex.Pattern.compile (string) Java .

Mari kita periksa dalam praktiknya sebagai sebahagian daripada ujian Spock :

def "pattern operator example"() { given: "a pattern" def p = ~'foo' expect: p instanceof Pattern and: "you can use slashy strings to avoid escaping of blackslash" def digitPattern = ~/\d*/ digitPattern.matcher('4711').matches() }

Ini juga cukup mudah, tetapi kita akan melihat bahawa pengendali ini hanyalah asas untuk beberapa pengendali lain, malah lebih berguna.

3. Operator Perlawanan

Sebilangan besar masa, dan terutama ketika menulis ujian, kami tidak begitu berminat untuk membuat objek Corak , tetapi sebaliknya, ingin memeriksa apakah String sesuai dengan ungkapan biasa tertentu (atau Corak ). Oleh itu, Groovy juga mengandungi pengendali perlawanan == ~ .

Ia mengembalikan boolean dan melakukan perlawanan yang ketat terhadap ungkapan biasa yang ditentukan. Pada dasarnya, ini adalah jalan pintas sintaksis untuk memanggil Pattern.matches (regex, string) .

Sekali lagi, kami akan memeriksanya dalam praktik sebagai sebahagian daripada ujian Spock :

def "match operator example"() { expect: 'foobar' ==~ /.*oba.*/ and: "matching is strict" !('foobar' ==~ /foo/) }

4. Cari Operator

Operator Groovy terakhir dalam konteks pemadanan corak adalah operator cari ~ = . Dalam kes ini, pengendali secara langsung akan membuat dan mengembalikan contoh java.util.regex.Matcher .

Kita boleh menggunakan contoh Matcher ini , tentu saja, dengan mengakses kaedah Java API yang diketahui. Tetapi di samping itu, kami juga dapat mengakses kumpulan yang sesuai dengan tatasusunan pelbagai dimensi.

Dan itu bukan semua - contoh Matcher secara automatik akan memaksa ke jenis boolean dengan memanggil kaedah find () jika digunakan sebagai predikat. Memetik dokumen rasmi Groovy, ini bermaksud "pengendali = ~ sesuai dengan penggunaan mudah operator Perl's = ~".

Di sini, kami melihat pengendali beraksi:

def "find operator example"() { when: "using the find operator" def matcher = 'foo and bar, baz and buz' =~ /(\w+) and (\w+)/ then: "will find groups" matcher.size() == 2 and: "can access groups using array" matcher[0][0] == 'foo and bar' matcher[1][2] == 'buz' and: "you can use it as a predicate" 'foobarbaz' =~ /bar/ }

5. Kesimpulan

Kami telah melihat bagaimana bahasa Groovy memberi kami akses ke ciri Java bawaan mengenai ungkapan biasa dengan cara yang sangat mudah.

Dokumentasi rasmi Groovy juga mengandungi beberapa contoh ringkas mengenai topik ini. Sangat keren jika anda menganggap bahawa contoh kod dalam dokumen dilaksanakan sebagai sebahagian daripada dokumentasi yang dibina.

Seperti biasa, contoh kod boleh didapati di GitHub.