Regex Khớp tất cả các ký tự giữa hai chuỗi


434

Ví dụ: "Đây chỉ là \ na câu đơn giản".

Tôi muốn khớp mọi ký tự giữa "Đây là" và "câu". Ngắt dòng nên được bỏ qua. Tôi không thể tìm ra cú pháp chính xác.


11
Bạn có thể muốn cho biết môi trường nào bạn đang sử dụng Regex. Có thể có sự khác biệt tùy thuộc vào chính xác ý của bạn khi ngắt dòng "bỏ qua".
Andrew Barber

Câu trả lời:


645

Ví dụ

(?<=This is)(.*)(?=sentence)

Regexr

Tôi đã sử dụng lookbehind (?<=)và nhìn về phía trước (?=)để "Đây là" và "câu" không được bao gồm trong trận đấu, nhưng điều này tùy thuộc vào trường hợp sử dụng của bạn, bạn cũng có thể chỉ cần viết This is(.*)sentence.

Điều quan trọng ở đây là bạn kích hoạt chế độ "dotall" của công cụ regex của mình, sao cho .phù hợp với dòng mới. Nhưng làm thế nào bạn làm điều này phụ thuộc vào công cụ regex của bạn.

Điều tiếp theo là nếu bạn sử dụng .*hoặc .*?. Câu đầu tiên là tham lam và sẽ khớp với "câu" cuối cùng trong chuỗi của bạn, câu thứ hai là lười biếng và sẽ khớp với "câu" tiếp theo trong chuỗi của bạn.

Cập nhật

Regexr

This is(?s)(.*)sentence

Trong đó (?) Bật công cụ sửa đổi dotall, làm cho .khớp các ký tự dòng mới.

Cập nhật 2:

(?<=is \()(.*?)(?=\s*\))

phù hợp với ví dụ của bạn "Đây là (một câu) đơn giản". Xem ở đây trên Regexr


@tchrist, xin lỗi tôi đã phải tìm cái này Tôi có hiểu điều này đúng và This is(?s)(.*)sentencesẽ làm việc không?
phù nề

@stema: Có, nên hoạt động để bật chế độ "chấm tất cả" trong hầu hết các thư viện regex.
tchrist

1
Điều đó chủ yếu giải quyết vấn đề của tôi, nhưng làm cách nào để đưa một ký tự khoảng trắng vào mẫu của tôi? Tôi đã thử như sau: "(. *?) ())" Để khớp với ")" ở cuối chuỗi, nhưng nó không hoạt động.
0xbadf00d

28
Chỉ cần một lưu ý - regexr nói rằng lookbehind không được hỗ trợ trong javascript
Kovo

2
Có cách nào để đối phó với các trường hợp lặp đi lặp lại của sự phân chia này trong một khối văn bản không? Ví dụ: "Đây chỉ là một câu đơn giản. Đây là một số nội dung bổ sung. Đây chỉ là một câu đơn giản. Và đây là một số nội dung khác. Đây chỉ là một câu đơn giản." Hiện tại nó phù hợp với toàn bộ chuỗi, thay vì từng trường hợp.
jzadra

181

Công cụ định lượng lười biếng cần thiết

Làm sống lại câu hỏi này bởi vì regex trong câu trả lời được chấp nhận dường như không hoàn toàn chính xác với tôi. Tại sao? Bởi vì

(?<=This is)(.*)(?=sentence)

sẽ phù hợp my first sentence. This is my secondtrongThis is my first sentence. This is my second sentence.

Xem bản demo .

Bạn cần một bộ định lượng lười biếng giữa hai cái nhìn. Thêm một ?ngôi sao làm cho lười biếng.

Điều này phù hợp với những gì bạn muốn:

(?<=This is).*?(?=sentence)

Xem bản demo . Tôi loại bỏ nhóm chụp, không cần thiết.

Chế độ DOTALL để phù hợp với các lần ngắt dòng

Lưu ý rằng trong bản demo, "dot khớp với chế độ ngắt dòng" (hay còn gọi là dot-all được đặt (xem cách bật DOTALL bằng nhiều ngôn ngữ khác nhau ). Trong nhiều hương vị regex, bạn có thể đặt nó với công cụ sửa đổi trực tuyến (?s), biến biểu thức thành:

(?s)(?<=This is).*?(?=sentence)

Tài liệu tham khảo


Bạn đúng về nhóm bắt giữ. Không biết tại sao tôi đã làm điều này. Nhưng sự khác biệt giữa .*.*?cũng được giải thích trong câu trả lời của tôi (đoạn trước "Cập nhật"). Vì vậy, tôi không nghĩ rằng câu trả lời của tôi là không chính xác.
phù nề

2
@stema Xin lỗi về quá trình nitpicking, trong khi bay qua một số câu trả lời của bạn ngày hôm qua, đó là câu duy nhất khiến tôi co giật. :) Tôi dịu dòng đầu tiên từ is incorrectđể doesn't seem quite correct to me... Hy vọng điều đó không làm bạn co giật, có lẽ chỉ là một sự khác biệt về nhận thức về những gì các regex cho một câu trả lời có lưu lượng cao như vậy nên được.
zx81

39

Hãy thử This is[\s\S]*sentence, hoạt động trong javascript


Làm thế nào để thực hiện một tra cứu lười biếng theo cách này?
AGamePlayer

4
@AwQiruiGuo giống như trên. [\s\S]*?(còn được gọi là: ký tự đại diện không tham lam)
phil294


13

dùng cái này: (?<=beginningstringname)(.*\n?)(?=endstringname)


Không biết lý do tại sao tất cả các phiếu bầu tăng, điều này cho phép ngắt dòng 0-1 và ngắt dòng phải ngay lập tức trước đóendstringname
OGHaza

Tôi thấy nó hữu ích để loại bỏ phần đầu của dòng nhật ký (dấu thời gian, v.v.). Tôi đã sử dụng dòng mới cho chuỗi đầu và "tại" cho chuỗi kết thúc.
Stan

2

Trong trường hợp bất cứ ai đang tìm kiếm một ví dụ về điều này trong bối cảnh Jenkins. Nó phân tích cú pháp build.log và nếu tìm thấy kết quả khớp, nó sẽ thất bại trong quá trình xây dựng với kết quả khớp.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}


0

Văn bản cao siêu 3x

Trong văn bản cao siêu, bạn chỉ cần viết hai từ bạn quan tâm để giữ ví dụ trong trường hợp của bạn, đó là

"Đây là" và "câu"

và bạn viết. * ở giữa

I E This is .* sentence

và điều này sẽ làm bạn tốt


Không chắc chắn câu hỏi là về cách thực hiện điều này trong Sublime Text nhưng chủ yếu hoạt động trong Sublime Text. Nó không hoạt động khi có một dòng ngắt giữa "Đây là" và "câu". Ngoài ra, văn bản cao siêu cũng chọn "Đây là" và "Câu" thay vì chỉ văn bản giữa hai chuỗi đó.
Dylan Kinnett

0

Đây là cách tôi đã làm:
Điều này đối với tôi dễ dàng hơn là cố gắng tìm ra regex cụ thể cần thiết.

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

0

để tìm kiếm nhanh trong VIM, bạn có thể sử dụng tại dấu nhắc Vim Control: / Đây là. * \ _. * câu


0

Tôi đã tìm đến regex ở đây để chuyển đổi cú pháp in này giữa bản in "chuỗi", trong Python2 trong các tập lệnh cũ với: print ("chuỗi"), cho Python3. Hoạt động tốt, nếu không, hãy sử dụng 2to3.py để chuyển đổi bổ sung. Đây là giải pháp của tôi cho người khác:

Dùng thử trên Regexr.com (không hoạt động trong NP ++ vì một số lý do):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

cho các biến:

(?<=print)( )(.*)(\n)
('$2')\n

cho nhãn và biến:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Làm cách nào để thay thế tất cả "chuỗi" in trong Python2 bằng print ("chuỗi") cho Python3?


0

Điều này làm việc cho tôi (Tôi đang sử dụng Mã VS ):

cho: This is just\na simple sentence

Sử dụng: This .+ sentence


0

RegEx để khớp mọi thứ giữa hai chuỗi bằng cách sử dụng phương pháp Java.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

Chúng ta hãy sử dụng các đối tượng Pattern và Matcher để sử dụng RegEx (. ?) * .

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Vì Matcher có thể chứa nhiều hơn một trận đấu, chúng tôi cần lặp lại kết quả và lưu trữ nó.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

Ví dụ này sẽ chỉ chứa từ "sẽ lưu" từ, nhưng trong văn bản lớn hơn có thể sẽ tìm thấy nhiều kết quả khớp hơn.

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.