2010-03-30 27 views
5

Tôi có tệp xml đơn giản và tôi muốn xóa mọi thứ trước thẻ <item> đầu tiên.Biểu thức chính quy java đơn giản thay thế câu hỏi

<sometag> 
    <something> 
    ..... 
    </something> 
    <item>item1 
    </item> 
    .... 
</sometag> 

Mã java sau không hoạt động:

String cleanxml = rawxml.replace("^[\\s\\S]+<item>", ""); 

cách chính xác để làm điều này là gì? Và làm cách nào để giải quyết vấn đề không tham lam? Xin lỗi tôi là một lập trình viên C#.

+5

Câu trả lời ngắn gọn: không. Thậm chí Jon Skeet cũng không thể phân tích cú pháp XML bằng các biểu thức chính quy. http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – Thomas

Trả lời

4

Vâng, nếu bạn muốn sử dụng regex, sau đó bạn có thể sử dụng replaceAll. Giải pháp này sử dụng định lượng không mong muốn và phương án ngược:

String cleanxml = rawxml.replaceAll(".*?(<item>.*)", "$1"); 

Hoặc bạn có thể sử dụng replaceFirst. Giải pháp này sử dụng một lookahead tích cực.

String cleanxml = rawxml.replaceFirst(".*?(?=<item>)", ""); 

Mặc dù vậy, bạn chỉ nên sử dụng indexOfsubstring.

String cleanxml = rawxml.substring(rawxml.indexOf("<item>")); 

Lý do tại sao replace không hoạt động là không char cũng không CharSequence quá tải là regex-based. Đó là thay thế ký tự (chuỗi) đơn giản.


Ngoài ra, khi những người khác cảnh báo bạn, trừ khi bạn đang xử lý XML đơn giản, bạn không nên sử dụng regex. Thay vào đó, bạn nên sử dụng một trình phân tích cú pháp XML thực tế.

1

sử dụng

replaceAll 

hoặc

replaceFirst 

chỉ cần thay thế sẽ tìm kiếm chuỗi phù hợp HTH

+0

Nó hoạt động. Cảm ơn! Nhưng tại sao regex trên không hoạt động? – Yang

+0

thay thế() không chấp nhận cụm từ thông dụng. Nó diễn giải các đối số của nó như là chuỗi ký tự. –

3

... Cách chính xác để thực hiện là gì? ...

Vì bạn đã hỏi đúng cách, cách chính xác để thực hiện việc này là phân tích cú pháp XML và xóa các nút và tái tuần tự hóa thành Chuỗi. Bạn không bao giờ nên sử dụng các biểu thức chính quy để thao tác XML hoặc bất kỳ tài liệu có cấu trúc nào khác có sẵn các trình phân tích cú pháp (JSON, YAML, vv).
Đối với XML nhỏ, tôi sẽ đề xuất JDOM.

Các vấn đề liên quan