Biểu thức chính quy để tìm một chuỗi được bao gồm giữa hai ký tự trong khi LOẠI TRỪ các dấu phân cách


294

Tôi cần trích xuất từ ​​một chuỗi một tập hợp các ký tự được bao gồm giữa hai dấu phân cách mà không trả về các dấu phân cách.

Một ví dụ đơn giản sẽ hữu ích:

Mục tiêu : trích xuất chuỗi con giữa các dấu ngoặc vuông, mà không trả về dấu ngoặc.

Chuỗi cơ sở :This is a test string [more or less]

Nếu tôi sử dụng reg sau. Ví dụ.

\ [. *? \]

Trận đấu là [more or less]. Tôi chỉ cần lấy more or less(không có dấu ngoặc).

Có khả năng làm việc đó không?


Câu trả lời:


453

Dễ dàng thực hiện:

(?<=\[)(.*?)(?=\])

Về mặt kỹ thuật đó là sử dụng lookahead và lookbehinds. Xem các xác nhận không có chiều rộng của Lookahead và Lookbehind . Mẫu bao gồm:

  • được đi trước bởi một [không được chụp (lookbehind);
  • một nhóm không tham lam bị bắt. Không tham lam khi dừng lại ở lần đầu tiên]; và
  • được theo sau bởi một] không được chụp (lookahead).

Ngoài ra, bạn chỉ có thể chụp những gì giữa dấu ngoặc vuông:

\[(.*?)\]

và trả lại nhóm bị bắt đầu tiên thay vì toàn bộ trận đấu.


138
"Dễ dàng thực hiện", LOL! :) Biểu thức thường xuyên luôn khiến tôi đau đầu, tôi có xu hướng quên chúng ngay khi tôi tìm ra cách giải quyết vấn đề của mình. Về các giải pháp của bạn: cái đầu tiên hoạt động như mong đợi, cái thứ hai thì không, nó giữ cả dấu ngoặc. Tôi đang sử dụng C #, có thể đối tượng RegEx có "hương vị" riêng của công cụ regex ...
Diego

5
Đó là làm điều đó bởi vì bạn đang xem toàn bộ trận đấu chứ không phải nhóm phù hợp đầu tiên.
cletus

Rất cám ơn, trang web rất hữu ích! Tôi sẽ giữ nó làm tài liệu tham khảo. :) Xin lỗi nếu tôi đã gây ra một số nhầm lẫn, phát triển C # không thực sự là một trong những kỹ năng của tôi ..
Diego

1
Điều này có hoạt động không nếu chuỗi con cũng chứa các dấu phân cách? Ví dụ trong This is a test string [more [or] less]này sẽ trở lại more [or] less?
gnzlbg

1
@gnzlbg không, nó sẽ trả về "thêm [hoặc"
MerickOWA

52

Nếu bạn đang sử dụng JavaScript , giải pháp đầu tiên được cung cấp bởi cletus (?<=\[)(.*?)(?=\]), sẽ không hoạt động vì JavaScript không hỗ trợ toán tử lookbehind.

Tuy nhiên, giải pháp thứ hai hoạt động tốt, nhưng bạn cần có được yếu tố phù hợp thứ hai.

Thí dụ:

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

Nó sẽ trở lại:

["[more or less]", "more or less"]

Vì vậy, những gì bạn cần là giá trị thứ hai. Sử dụng:

var matched = regex.exec(strToMatch)[1];

Trở về:

"more or less"

2
Điều gì xảy ra nếu có nhiều kết quả của [nhiều hơn hoặc ít hơn] trong chuỗi?

Các xác nhận của Lookbehind đã được thêm vào RegExp trong ES2018
TheDarkIn1978

19

Bạn chỉ cần 'chụp' bit giữa các dấu ngoặc.

\[(.*?)\]

Để chụp bạn đặt nó trong ngoặc đơn. Bạn không nói ngôn ngữ này đang sử dụng. Ví dụ, trong Perl, bạn sẽ truy cập vào điều này bằng cách sử dụng biến $ 1.

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

Các ngôn ngữ khác sẽ có cơ chế khác nhau. C #, ví dụ, sử dụng lớp bộ sưu tập Match , tôi tin.


Cảm ơn, nhưng giải pháp này không hiệu quả, nó bao gồm cả dấu ngoặc vuông. Như tôi đã viết trong nhận xét của mình về giải pháp của Cletus, có thể đối tượng C # RegEx diễn giải nó theo cách khác. Tôi không phải là chuyên gia về C #, vì vậy đó chỉ là phỏng đoán, có lẽ đó chỉ là sự thiếu hiểu biết của tôi. :)
Diego

11

[^\[] Phù hợp với bất kỳ nhân vật không phải là [.

+Khớp 1 hoặc nhiều hơn bất cứ thứ gì không có [. Tạo các nhóm của các trận đấu.

(?=\])Nhìn tích cực ]. Kết hợp một nhóm kết thúc ]mà không bao gồm nó trong kết quả.

Làm xong.

[^\[]+(?=\])

Bằng chứng.

http://regexr.com/3gobr

Tương tự như giải pháp được đề xuất bởi null. Nhưng bổ sung \]là không cần thiết. Như một lưu ý bổ sung, nó xuất hiện \là không cần thiết để thoát khỏi [sau ^. Để dễ đọc, tôi sẽ để nó trong.

Không hoạt động trong tình huống mà các dấu phân cách giống hệt nhau. "more or less"ví dụ.


8

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);


3

Tôi gặp vấn đề tương tự khi sử dụng regex với bash scripting. Tôi đã sử dụng giải pháp 2 bước bằng cách sử dụng đường ống với grep -o

 '\[(.*?)\]'  

đầu tiên và sau đó

'\b.*\b'

Rõ ràng là không hiệu quả ở các câu trả lời khác, nhưng là một thay thế.


3

Công cụ này đặc biệt hoạt động với trình phân tích cú pháp biểu thức chính quy của javascript /[^[\]]+(?=])/g

chỉ cần chạy nó trong giao diện điều khiển

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

2

Tôi muốn tìm một chuỗi giữa / và #, nhưng # đôi khi là tùy chọn. Đây là regex tôi sử dụng:

  (?<=\/)([^#]+)(?=#*)

0

Đây là cách tôi có mà không có '[' và ']' trong C #:

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

Đầu ra là:

more or less

-1

Nếu bạn cần trích xuất văn bản mà không có dấu ngoặc, bạn có thể sử dụng bash awk

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

kết quả:

hola mundo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.