Câu trả lời:
Giả sử bạn muốn phần giữa các dấu ngoặc đơn, hãy sử dụng biểu thức chính quy này với Matcher
:
"'(.*?)'"
Thí dụ:
String mydata = "some string with 'the data i want' inside";
Pattern pattern = Pattern.compile("'(.*?)'");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
Kết quả:
dữ liệu tôi muốn
this 'is' my 'data' with quotes
nó sẽ dừng sớm và quay lại is
thay vì khớp càng nhiều ký tự càng tốt và trả về is' my 'data
, đó là hành vi mặc định.
Bạn không cần regex cho việc này.
Thêm apache commons lang vào dự án của bạn ( http://commons.apache.org/proper/commons-lang/ ), sau đó sử dụng:
String dataYouWant = StringUtils.substringBetween(mydata, "'");
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".*'([^']*)'.*");
String mydata = "some string with 'the data i want' inside";
Matcher matcher = pattern.matcher(mydata);
if(matcher.matches()) {
System.out.println(matcher.group(1));
}
}
}
Có một lớp lót đơn giản cho việc này:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
Bằng cách làm cho nhóm phù hợp tùy chọn, điều này cũng phục vụ cho các trích dẫn không được tìm thấy bằng cách trả lại một khoảng trống trong trường hợp đó.
Xem bản demo trực tiếp .
Bởi vì bạn cũng đánh dấu Scala, một giải pháp không có biểu thức chính quy dễ dàng xử lý nhiều chuỗi trích dẫn:
val text = "some string with 'the data i want' inside 'and even more data'"
text.split("'").zipWithIndex.filter(_._2 % 2 != 0).map(_._1)
res: Array[java.lang.String] = Array(the data i want, and even more data)
.split('\'').get(2)
hoặc một cái gì đó đến mức đó trong Java? Tôi nghĩ rằng bạn có thể cần phải quét não nếu bạn nghĩ đó là một giải pháp dễ đọc - có vẻ như ai đó đang cố gắng thực hiện một số môn đánh gôn với tôi.
như trong javascript:
mydata.match(/'([^']+)'/)[1]
regrec thực tế là: /'([^']+)'/
nếu bạn sử dụng công cụ sửa đổi không tham lam (theo bài đăng khác) thì nó sẽ như thế này:
mydata.match(/'(.*?)'/)[1]
nó sạch hơn
Ở Scala,
val ticks = "'([^']*)'".r
ticks findFirstIn mydata match {
case Some(ticks(inside)) => println(inside)
case _ => println("nothing")
}
for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches
val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception
val ticks = ".*'([^']*)'.*".r
val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks
String dataIWant = mydata.split("'")[1];
Xem bản demo trực tiếp
Apache Commons Lang cung cấp một loạt các tiện ích trợ giúp cho API java.lang, đáng chú ý nhất là các phương thức thao tác Chuỗi. Trong trường hợp của bạn, các chuỗi con bắt đầu và kết thúc là như nhau, vì vậy chỉ cần gọi hàm sau.
StringUtils.substringBetween(String str, String tag)
Lấy Chuỗi được lồng vào giữa hai trường hợp của cùng một Chuỗi .
Nếu các điểm bắt đầu và kết thúc khác nhau thì sử dụng phương pháp quá tải sau đây.
StringUtils.substringBetween(String str, String open, String close)
Lấy chuỗi được lồng vào giữa hai chuỗi.
Nếu bạn muốn tất cả các trường hợp của các chuỗi con phù hợp, sau đó sử dụng,
StringUtils.substringsBetween(String str, String open, String close)
Tìm kiếm Chuỗi cho các chuỗi con được phân tách bằng thẻ bắt đầu và kết thúc, trả về tất cả các chuỗi con phù hợp trong một mảng .
Ví dụ trong câu hỏi để có được tất cả các phiên bản của chuỗi con phù hợp
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
bạn có thể sử dụng cái này tôi sử dụng vòng lặp while để lưu trữ tất cả các chuỗi con phù hợp trong mảng nếu bạn sử dụng
if (matcher.find())
{
System.out.println(matcher.group(1));
}
bạn sẽ có được chuỗi con phù hợp để bạn có thể sử dụng chuỗi này để có được tất cả chuỗi con phù hợp
Matcher m = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+").matcher(text);
// Matcher mat = pattern.matcher(text);
ArrayList<String>matchesEmail = new ArrayList<>();
while (m.find()){
String s = m.group();
if(!matchesEmail.contains(s))
matchesEmail.add(s);
}
Log.d(TAG, "emails: "+matchesEmail);
Một số cách nhóm (1) không làm việc cho tôi. Tôi đã sử dụng nhóm (0) để tìm phiên bản url.
Pattern urlVersionPattern = Pattern.compile("\\/v[0-9][a-z]{0,1}\\/");
Matcher m = urlVersionPattern.matcher(url);
if (m.find()) {
return StringUtils.substringBetween(m.group(0), "/", "/");
}
return "v0";