Trong Java, tôi đang cố gắng trả về tất cả các đối sánh regex cho một mảng nhưng có vẻ như bạn chỉ có thể kiểm tra xem mẫu có khớp với thứ gì đó hay không (boolean). Ai đó có thể giúp tôi sử dụng một trận đấu regex để tạo thành một mảng của tất cả các chuỗi phù hợp với một biểu thức regex trong một chuỗi nhất định? Cảm ơn!Tạo mảng các đối sánh regex
Trả lời
(4castle's answer là tốt hơn so với dưới đây nếu bạn có thể giả định Java> = 9)
bạn cần phải tạo một khớp và sử dụng để lặp đi lặp lại tìm trận đấu.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
...
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile("your regular expression here")
.matcher(yourStringHere);
while (m.find()) {
allMatches.add(m.group());
}
Sau này, allMatches
chứa các trận đấu, và bạn có thể sử dụng allMatches.toArray(new String[0])
để có được một mảng nếu bạn thực sự cần.
Bạn cũng có thể sử dụng để viết MatchResult
chức năng helper để lặp qua các trận đấu kể từ Matcher.toMatchResult()
lợi nhuận một bản chụp của tình trạng hiện tại của nhóm.
Ví dụ, bạn có thể viết một iterator lười biếng để cho phép bạn làm
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
bằng cách làm một cái gì đó như thế này:
public static Iterable<MatchResult> allMatches(
final Pattern p, final CharSequence input) {
return new Iterable<MatchResult>() {
public Iterator<MatchResult> iterator() {
return new Iterator<MatchResult>() {
// Use a matcher internally.
final Matcher matcher = p.matcher(input);
// Keep a match around that supports any interleaving of hasNext/next calls.
MatchResult pending;
public boolean hasNext() {
// Lazily fill pending, and avoid calling find() multiple times if the
// clients call hasNext() repeatedly before sampling via next().
if (pending == null && matcher.find()) {
pending = matcher.toMatchResult();
}
return pending != null;
}
public MatchResult next() {
// Fill pending if necessary (as when clients call next() without
// checking hasNext()), throw if not possible.
if (!hasNext()) { throw new NoSuchElementException(); }
// Consume pending so next call to hasNext() does a find().
MatchResult next = pending;
pending = null;
return next;
}
/** Required to satisfy the interface, but unsupported. */
public void remove() { throw new UnsupportedOperationException(); }
};
}
};
}
Với điều này,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
sản lượng
a at 0 b at 1 a at 3 c at 4 a at 5 a at 7 b at 8 a at 10
Tôi sẽ không đề nghị sử dụng một ArrayList ở đây vì bạn không biết trước kích thước và có thể muốn tránh việc thay đổi kích thước bộ đệm. Thay vào đó, tôi muốn một LinkedList - mặc dù nó chỉ là một gợi ý và không làm cho câu trả lời của bạn ít hợp lệ hơn. – Liv
@Liv, dành thời gian để đánh giá cả 'ArrayList' và' LinkedList', kết quả có thể gây ngạc nhiên. –
Tôi nghe những gì bạn đang nói và tôi biết tốc độ thực thi và dấu chân bộ nhớ trong cả hai trường hợp, vấn đề với ArrayList là hàm tạo mặc định tạo ra dung lượng là 10 - nếu bạn vượt qua kích thước đó với các cuộc gọi để thêm() bạn sẽ phải chịu sự phân bổ bộ nhớ và bản sao mảng - và điều đó có thể xảy ra một vài lần. Cấp, nếu bạn mong đợi chỉ là một vài trận đấu thì cách tiếp cận của bạn là một cách hiệu quả hơn; tuy nhiên, nếu bạn thấy rằng mảng "thay đổi kích thước" xảy ra nhiều hơn một lần, tôi sẽ đề xuất một LinkedList, thậm chí nhiều hơn thế nếu bạn đang xử lý một ứng dụng độ trễ thấp. – Liv
Dưới đây là một ví dụ đơn giản:
Pattern pattern = Pattern.compile(regexPattern);
List<String> list = new ArrayList<String>();
Matcher m = pattern.matcher(input);
while (m.find()) {
list.add(m.group());
}
(nếu bạn có nhiều nhóm chụp, bạn có thể tham khảo chúng bằng cách chỉ mục của họ như một đối số của phương pháp nhóm Nếu bạn cần một mảng, sau đó sử dụng list.toArray()
.)
pattern.matches (đầu vào) không hoạt động. Bạn phải vượt qua mẫu regex của bạn (một lần nữa!) -> WTF Java ?! pattern.matches (Chuỗi regex, Chuỗi đầu vào); Bạn có nghĩa là pattern.matcher (đầu vào)? –
@ElMac ['Pattern.matches()'] (http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#matches-java.lang.String-java .lang.CharSequence-) là một phương thức tĩnh, bạn không nên gọi nó trên một cá thể 'Pattern'. 'Pattern.matches (regex, input)' chỉ đơn giản là viết tắt của 'Pattern.compile (regex) .matcher (đầu vào) .matches()'. – dimo414
Từ Official Regex Java Trails:
Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));
Matcher matcher =
pattern.matcher(console.readLine("Enter input string to search: "));
boolean found = false;
while (matcher.find()) {
console.format("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
found = true;
}
Sử dụng find
và chèn kết quả group
ở mảng của bạn/Danh sách/bất cứ điều gì.
Java làm cho regex quá phức tạp và không tuân theo kiểu perl. Hãy nhìn vào MentaRegex để xem làm thế nào bạn có thể thực hiện điều đó trong một dòng mã Java:
String[] matches = match("aa11bb22", "/(\\d+)/g"); // => ["11", "22"]
Thật tuyệt. Các dấu gạch chéo đôi vẫn trông xấu xí nhưng tôi đoán không có scape từ đó. – JohnPristine
mentaregex-0.9.5.jar, 6Kb đã lưu lại ngày của tôi, Obrigado Sérgio! –
CHÚ Ý! Giải pháp tốt nhất. Sử dụng nó! –
Set<String> keyList = new HashSet();
Pattern regex = Pattern.compile("#\\{(.*?)\\}");
Matcher matcher = regex.matcher("Content goes here");
while(matcher.find()) {
keyList.add(matcher.group(1));
}
return keyList;
Trong Java 9, bây giờ bạn có thể sử dụng Matcher#results()
để có được một Stream<MatchResult>
mà bạn có thể sử dụng để có được một danh sách/mảng của các kết quả phù hợp.
import java.util.regex.Pattern;
import java.util.regex.MatchResult;
String[] matches = Pattern.compile("your regex here")
.matcher("string to search from here")
.results()
.map(MatchResult::group)
.toArray(String[]::new);
// or .collect(Collectors.toList())
- 1. Lỗi đối sánh Regex
- 2. In các đối sánh regex trong java
- 3. Số lượng đối sánh regex
- 4. Regex để đối sánh các từ một phần (JavaScript)
- 5. CÁCH: Apache Camel, các tệp đối sánh Regex
- 6. cách kiểm tra đối sánh regex
- 7. JavaScript REGEX Đối sánh tất cả và thay thế
- 8. Regex đối xứng để đối sánh dấu gạch chéo
- 9. So sánh các mảng đối tượng, cách tối ưu
- 10. Ký tự đối sánh regex không được thoát
- 11. Đúc mảng đối tượng thành mảng có thể so sánh
- 12. So sánh các hương vị Regex
- 13. Đối sánh Regex để bắt đầu nhiều từ trong chuỗi
- 14. Regex - Thuộc tính đối sánh trong mã HTML
- 15. đối sánh regex với giao lộ trong C#
- 16. Regex để đối sánh một từ với dấu + (cộng)
- 17. Perl, Gán cho biến từ đối sánh regex
- 18. Lặp lại thông qua các đối sánh regex Javascript để sửa đổi chuỗi gốc
- 19. Regex để đối sánh nhận xét đa dòng kiểu C
- 20. regex: từ đối sánh kết thúc bằng "Id"
- 21. Văn bản đối sánh regex Python giữa dấu ngoặc kép
- 22. Làm cách nào để sử dụng đối sánh regex webmock?
- 23. Regex để đối sánh chữ và số và dấu cách
- 24. Regex - Đối sánh toàn bộ chuỗi Trừ khi
- 25. Regex để thay thế chuỗi đối sánh chính xác
- 26. So sánh các chuỗi và mảng C#
- 27. Làm cách nào để tìm kiếm thông qua các đối sánh regex bằng Python?
- 28. Regex để đối sánh các từ có độ dài nhất định
- 29. Tìm chỉ mục của tất cả các đối sánh regex trong Python?
- 30. regex để đối sánh một từ với các ký tự duy nhất (không lặp lại)
Tốt câu hỏi. Thông tin bạn tìm kiếm phải là một phần của tài liệu Java trên Regex và Matcher. Đáng buồn thay, nó không phải là. – Cheeso
Một sự xấu hổ thực sự.Chức năng này dường như tồn tại trong hộp ở hầu hết các ngôn ngữ khác (có hỗ trợ biểu thức chính quy). –