Lấy văn bản tiếp theo sau trận đấu regex


84

Tôi mới sử dụng Regex, tôi đã xem qua rất nhiều hướng dẫn nhưng tôi chưa tìm thấy hướng dẫn nào phù hợp với những gì tôi muốn làm,

Tôi muốn tìm kiếm thứ gì đó, nhưng trả về mọi thứ theo sau nó chứ không trả về chính chuỗi tìm kiếm

ví dụ: " Một số câu khập khiễng thật tuyệt vời "

tìm kiếm " câu "

trả lại " điều đó thật tuyệt vời "

bất kì sự trợ giúp nào đều được đánh giá cao

Đây là regex của tôi cho đến nay

sentence(.*) 

nhưng nó trả về: câu thật tuyệt vời

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}

Cuộc gọi thực tế của bạn là gì? Bạn đang sử dụng Matcher?
Grzegorz Oledzki

Tôi đang sử dụng công cụ so khớp và mẫu
Scott

... và chúng tôi vẫn muốn xem mã Java thực của bạn để giúp đánh giá điều gì sai.
Steve Jorgensen

System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Nishant

3
@DavidIsNotHere phát xít nên có một N vốn ...
Lee Taylor

Câu trả lời:


135

Bạn có thể thực hiện việc này với "chỉ biểu thức chính quy" như bạn đã yêu cầu trong nhận xét:

(?<=sentence).*

(?<=sentence)là một khẳng định tích cực về cái nhìn sau . Điều này khớp tại một vị trí nhất định trong chuỗi, cụ thể là tại một vị trí ngay sau văn bản sentencemà không làm cho chính văn bản đó trở thành một phần của đối sánh. Do đó, (?<=sentence).*sẽ khớp với bất kỳ văn bản nào sau đó sentence.

Đây là một tính năng khá hay của regex. Tuy nhiên, trong Java, điều này sẽ chỉ hoạt động đối với các biểu thức con có độ dài hữu hạn, tức (?<=sentence|word|(foo){1,4})là hợp pháp, nhưng (?<=sentence\s*)không phải.


Bạn tuyên bố rằng nó không nên bao gồm khẳng định tích cực. Vì vậy, tôi giả định rằng ". * (? <= Câu)" nên trả về mọi thứ, nhưng không bao gồm "câu". Nhưng không, nó cũng trả về "câu". Tôi đang thiếu gì?
JJJones_3860

@ user2184214: Đó là bởi vì nó là một cái nhìn đằng sau sự khẳng định. .*khớp với bất kỳ văn bản nào và sau đó (?<=...)nhìn ngược lại để tìm từ đó sentence, khẳng định trong trường hợp này rằng khớp kết thúc bằng từ đó. Nếu bạn muốn dừng trước từ đó, bạn cần nhìn về phía trước : .*(?=sentence)sẽ khớp với bất kỳ văn bản nào theo sau sentence.
Tim Pietzcker

17

Regex của bạn "sentence(.*)"là đúng. Để truy xuất nội dung của nhóm trong ngoặc đơn, bạn sẽ gọi:

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

Lưu ý việc sử dụng m.find()trong trường hợp này (cố gắng tìm bất kỳ nơi nào trên chuỗi) và không m.matches()(sẽ không thành công vì tiền tố "some lame"; trong trường hợp này, regex sẽ cần ".*sentence(.*)")


Cảm ơn, Nhưng điều gì sẽ xảy ra nếu tôi chỉ muốn nó trả lại "điều đó thật tuyệt vời"
Scott

Cảm ơn người đàn ông, điều này làm việc tuyệt vời, tôi đã hy vọng có một cách để làm điều này chỉ với các biểu hiện thường xuyên, nếu tôi không thể tìm thấy một cách để làm điều đó theo cách đó, điều này sẽ làm việc là tốt
Scott

Có thể là một ý tưởng tồi khi thêm "(. *)" Vào cuối regexp cho màn trình diễn ...
egon

8

nếu Matcher được khởi tạo str, sau trận đấu, bạn có thể nhận được phần sau trận đấu với

str.substring(matcher.end())

Mã mẫu:

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

Đầu ra:

điều đó thật tuyệt vời


matcher.find()là bắt buộc trước đó, IMO.
Nishant

@Nishant đó là những gì tôi đã viết: "sau trận đấu". Đã thêm mã mẫu để minh họa
Sean Patrick Floyd

1

Bạn cần sử dụng nhóm (int) của đối sánh của mình - nhóm (0) là toàn bộ đối sánh và nhóm (1) là nhóm đầu tiên bạn đã đánh dấu. Trong ví dụ bạn chỉ định, nhóm (1) là những gì đứng sau " câu ".


1

Bạn chỉ cần đặt "group (1)" thay vì "group ()" ở dòng sau và kết quả trả về sẽ là thứ bạn mong đợi:

System.out.println("I found the text: " + matcher.group(**1**).toString());
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.