2015-01-20 13 views
8

Trong chuỗi có độ dài số lẻ, bạn có thể khớp (hoặc chụp) ký tự ở giữa như thế nào?Làm thế nào để khớp với ký tự ở giữa trong một chuỗi với regex?

Điều này có thể thực hiện với PCRE, đồng bằng Perl hoặc Java regex flavor?

Với .NET regex, bạn có thể sử dụng balancing groups để giải quyết dễ dàng (đó có thể là một ví dụ tốt). Bởi đồng bằng Perl regex tôi có nghĩa là không sử dụng bất kỳ cấu trúc mã như (??{ ... }), mà bạn có thể chạy bất kỳ mã và tất nhiên làm bất cứ điều gì.

Chuỗi có thể có bất kỳ độ dài số lẻ nào.

Ví dụ: trong chuỗi 12345 bạn muốn nhận được 3, ký tự ở giữa chuỗi.

Đây là câu hỏi về khả năng của hương vị regex hiện đại chứ không phải về thuật toán tốt nhất để thực hiện điều đó theo một cách khác.

+6

Perl: Vâng. Sử dụng đệ quy hoặc '/^(. *) (.) (?? {'.' X length ($ 1)}) \ z/s' – ikegami

+0

Đây có phải là ngữ cảnh không nhạy cảm không? – Oli

+0

@ikegami, tôi đoán tôi không nên nói Perl, hoặc ít nhất là không sử dụng mã Perl. Trong trường hợp đó bạn cũng có thể sử dụng một hàm chuỗi cơ bản. – Qtax

Trả lời

7

Với PCRE và Perl (và có lẽ Java), bạn có thể sử dụng :

^(?:.(?=.*?(?(1)(?=.\1$))(.\1?$)))*(.) 

sẽ ghi lại ký tự trung bình của các chuỗi dài lẻ trong nhóm chụp thứ 2.

Explained:

^ # beginning of the string 
(?: # loop 
    . # match a single character 
    (?= 
    # non-greedy lookahead to towards the end of string 
    .*? 
    # if we already have captured the end of the string (skip the first iteration) 
    (?(1) 
     # make sure we do not go past the correct position 
     (?= .\1$) 
    ) 
    # capture the end of the string +1 character, adding to \1 every iteration 
    (.\1?$) 
) 
)* # repeat 
# the middle character follows, capture it 
(.) 
+2

Tôi đã tìm thấy điều này: '^ (?:. (? =. * ((? (1). \ 1 |.)) $)) * \ K.' mà không phải là rất khác nhau. –

+2

hoặc với số lượng chính xác: '^ (?:. (? =. + ((? (1). \ 1 |.)) $)) * \ K.' –

+2

@CasimiretHippolyte, giải pháp tốt đẹp, +1! Bạn nên đăng nó. – Qtax

1

Hmm, có lẽ ai đó có thể tìm ra một giải pháp regex tinh khiết, nhưng nếu không bạn có thể luôn luôn tự động xây dựng regex như thế này:

public static void main(String[] args) throws Exception { 
    String s = "12345"; 
    String regex = String.format(".{%d}3.{%d}", s.length()/2, s.length()/2); 
    Pattern p = Pattern.compile(regex); 
    System.out.println(p.matcher(s).matches()); 
} 
Các vấn đề liên quan