2010-10-26 31 views
19

XIN ĐỌC KỸ THUẬT: Đây là một chút khác thường và bạn sẽ bị cám dỗ để nói những thứ như "đó không phải là cách sử dụng regex" hoặc "dude, chỉ cần sử dụng String.SubString(), "Etc ...Regex để nhận văn bản GIỮA hai ký tự

Tôi cần phải viết một regex (để sử dụng phương thức đã tồn tại trước đó) sẽ khớp với văn bản GIỮA các dấu ngoặc nhọn, NHƯNG KHÔNG phải là dấu ngoặc nhọn.

Ví dụ: "{MatchThisText}" "La la la {} MatchThisText la la la ..."
nên Cả hai trận đấu: "MatchThisText"

Someone asked this exact question a year ago, và ông có một loạt các giải pháp cho các regexes S W phù hợp với các dấu ngoặc nhọn ngoài "MatchThisText", dẫn đến kết hợp của "{MatchThisText}" mà không phải là những gì anh ta (hoặc tôi) cần thiết.

Nếu ai đó có thể viết một Regex thực sự chỉ phù hợp với các ký tự GIỮA các dấu ngoặc nhọn, tôi thực sự sẽ đánh giá cao nó. Nó sẽ cho phép bất kỳ giá trị ASCII nào và nên dừng trận đấu tại khung đóng FIRST.

Ví dụ: "{retailCategoryUrl}/{lọc}"
nên Phù hợp: retailCategoryUrl và bộ lọc
Nhưng không khớp nhau: "retailCategoryUrl}/{bộ lọc" (Tất cả mọi thứ nhưng niềng răng ngoài)

Xin chào, đây thực sự là một điều khó khăn đối với tôi, vì vậy hãy tha thứ cho câu hỏi nếu điều này là tầm thường đối với một số bạn.

THANKS!

+0

Khá dễ dàng (yêu cầu nhóm, nhưng thành thật, đây là một tính năng cơ bản), trừ khi bạn muốn xem xét các dấu ngoặc ôm" chính xác " (ví dụ như các trình phân tích cú pháp đầy đủ làm), trong trường hợp nó không thể thực hiện được (trừ khi sử dụng các phần mở rộng không phải là regex-y, một số triển khai, ví dụ như NET). – delnan

+0

Chúng ta sẽ cần nhiều ngữ cảnh hơn, vì giải pháp có lẽ sẽ liên quan đến các nhà điều hành nhìn về phía sau và nhìn về phía trước, do đó, phụ thuộc vào phương ngữ của regex bạn đang sử dụng. –

+0

'{(\ w +)}' - các dấu ngoặc biểu thị một nhóm, bạn có thể lấy nội dung của. –

Trả lời

17

Python:

(?<={)[^}]*(?=}) 

Trong bối cảnh:

#!/usr/bin/env python 

import re 

def f(regexStr,target): 
    mo = re.search(regexStr,target) 
    if not mo: 
     print "NO MATCH" 
    else: 
     print "MATCH:",mo.group() 

f(r"(?<={)[^}]*(?=})","{MatchThisText}") 
f(r"(?<={)[^}]*(?=})","La la la {MatchThisText} la la la...") 

in:

MATCH: MatchThisText 
MATCH: MatchThisText 
+1

để ý rằng đôi khi bạn sẽ cần phải thoát khỏi '{' bằng cách sử dụng một cái gì đó như: '(? <= \ {) [^ \}] * (? = \})' Vì một số các ứng dụng sẽ cố gắng suy nghĩ về các dấu ngoặc nhọn như đứng cho toán tử lặp lại. – andi

8

Bạn sẽ cần một nhà điều hành trận đấu không tham lam, *?, dừng trận đấu ngay sau khi động cơ nhìn thấy một cú đúp uốn cong. Sau đó, bạn cần phải nhóm những gì bên trong niềng răng, sử dụng dấu ngoặc đơn. Điều này nên làm điều đó:

{(.*?)} 

Sau đó, bạn sẽ cần nhận giá trị từ group số 1 trong API regex của mình. (Làm thế nào bạn làm điều đó phụ thuộc vào ngôn ngữ lập trình của bạn/API.)

+0

Rất hữu ích, cảm ơn! – mdegges

12

Nếu bạn đang sử dụng một động cơ RegExp với lookahead và hỗ trợ lookbehind như Python, sau đó bạn có thể sử dụng

/(?<={)[^}]*(?=})/

Nếu nó doesn 't (như javascript), bạn có thể sử dụng /{([^}]*)}/ và nhận được kết quả chuỗi con.Javascript dụ:

"{foo}".match(/{([^}]*)}/)[1] // => 'foo'

0

current answer làm việc với .NET Regex nhưng cần phải loại bỏ các dấu ngoặc nhọn từ tất cả các trận đấu:

var regex = new Regex(@"(?<={)[^}]*(?=})", RegexOptions.Compiled); 
var results = regex.Matches(source) 
        .Cast<Match>() 
        .Select(m => m.Value.TrimStart('{').TrimEnd('}')); 
0

Trong javascript bạn nhận được một mảng với tất cả các trận đấu. Dưới đây là ví dụ cho biết văn bản giữa các chuỗi css` và `cho các chuỗi mẫu machting:

yourstring.match(/css`([^}]+).`/gmi) 
Các vấn đề liên quan