2009-04-18 29 views
30

Tương đương Groovy của mã Perl sau đây là gì?Cú pháp Groovy để đối sánh cụm từ thông dụng

my $txt = "abc : groovy : def"; 
if ($txt =~/: (.+?) : /) { 
    my $match = $1; 
    print "MATCH=$match\n"; 
    # should print "MATCH=groovy\n" 
} 

Tôi biết rằng có nhiều cách để thực hiện điều đó (bao gồm cả cách Java thông thường) - nhưng cách "Groovy" là làm gì?

Đây là một cách để làm điều đó, nhưng nó cảm thấy một chút vụng về - đặc biệt là ký hiệu mảng (m[0][1]) có cảm giác hơi lạ. Có cách nào tốt hơn không? Nếu không - vui lòng mô tả logic đằng sau m[0][1].

def txt = "java : groovy : grails" 
if ((m = txt =~/: (.+?) :/)) { 
    def match = m[0][1] 
    println "MATCH=$match" 
} 

Trả lời

13

Đây là trận đấu gần nhất với các mã Perl rằng tôi có thể đạt được:

def txt = "abc : groovy : def" 
if ((m = txt =~/: (.+?) : /)) { 
    def match = m.group(1) 
    println "MATCH=$match" 
} 
+1

Bản in này sẽ như thế nào? Trông khó hiểu với mắt thường. –

+0

Cách này hoạt động? Điều này làm gì? Trông khó hiểu với mắt thường. –

+0

tại sao bạn quấn phần '' 'm = txt = ~ /: (. +?): /' '' Trong câu lệnh if? – Sajuuk

0

Đây là hiểu biết của tôi tốt nhất về cách làm sử dụng cú pháp Groovy này (nhưng xem phản ứng lfaraone của quá):

import java.util.regex.Matcher 

def txt = 'abc : groovy : def' 
if (txt =~ ~/ : (.+?) : /) { 
    def match = Matcher.lastMatcher[0][1] 
    println "MATCH=$match" 
} 
+0

Cảm ơn trả lời của bạn! Tôi nghĩ rằng mã của bạn sẽ thất bại với một IndexOutOfBoundsException nếu không có trận đấu. Tôi đã chỉnh sửa bài đăng của mình trước khi tôi thấy câu trả lời của bạn - vì vậy bạn có thể muốn xem lại bài đăng của mình. Vui lòng xem nội dung về ký hiệu m [0] [1]. – knorv

+1

Cảm ơn, tôi đã cập nhật câu trả lời của mình. Ngoài ra, một Matcher trong Java có thể có nhiều kết quả phù hợp. (Hãy suy nghĩ về lá cờ/g cho các trận đấu Perl.) Chỉ mục đầu tiên cho phép bạn chỉ định trận đấu mà bạn quan tâm. –

51

m[0] là đối tượng khớp đầu tiên.
m[0][0] là mọi thứ phù hợp trong trận đấu này.
m[0][1] là ảnh chụp đầu tiên trong trận đấu này.
m[0][2] là lần chụp thứ hai trong trận đấu này.

Dựa trên những gì tôi đã đọc (Tôi không có chương trình trong Groovy hoặc có một bản sao tiện dụng), được đưa ra

def m = "barbaz" =~ /(ba)([rz])/; 

m[0][0] sẽ "bar"
m[0][1] sẽ "ba"
m[0][2] sẽ "r"
m[1][0] sẽ là "baz"
m[1][1] sẽ là "ba"
m[1][2] sẽ "z"

Tôi không thể chịu đựng không biết nếu tôi là đúng hay không, vì vậy tôi đã tải về groovy và viết một ví dụ:

def m = "barbaz" =~ /(ba)([rz])/; 

println "m[0][0] " + m[0][0] 
println "m[0][1] " + m[0][1] 
println "m[0][2] " + m[0][2] 
println "m[1][0] " + m[1][0] 
println "m[1][1] " + m[1][1] 
println "m[1][2] " + m[1][2] 
+1

Cảm ơn bạn đã trả lời. Bạn có thể đưa ra một ví dụ về khi có thể có nhiều đối tượng trùng khớp (m [1]) không? – knorv

Các vấn đề liên quan