2013-04-02 35 views
6

Tôi có đoạn code Java sau:Java regex để loại bỏ thẻ XML, nhưng không phải thẻ nội dung

str = str.replaceAll("<.*?>.*?</.*?>|<.*?/>", ""); 

này biến một String như sau:

How now <fizz>brown</fizz> cow. 

Into:

How now cow. 

Tuy nhiên, tôi muốn nó chỉ tách các thẻ <fizz></fizz> hoặc chỉ độc lập </fizz> thẻ và chỉ để nguyên nội dung của phần tử. Vì vậy, một regex mà sẽ biến trên vào:

How now brown cow. 

Hoặc, sử dụng một chuỗi phức tạp hơn, somethng có thể biến:

How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow. 

Into:

How now brown cow. 

Tôi cố gắng này:

str = str.replaceAll("<.*?></.*?>|<.*?/>", ""); 

Và điều đó không làm việc chút nào. Bất kỳ ý tưởng? Cảm ơn trước!

+0

thường nếu các thẻ 'xml' và' regex' hiển thị cùng nhau, bạn sẽ nhận được nhận xét, nó nói .... – Kent

+1

Bạn đã thử sử dụng trình phân tích cú pháp XML chưa? Tôi thấy cuộc sống của tôi dễ dàng hơn nhiều với JDOM để phân tích cú pháp XML. –

+0

Tôi không thể đi vào chi tiết mà không rơi vào một backstory rất lớn nhưng thats không thể ở đây (XML Parser). Chỉ cần tìm một giải pháp regex. – IAmYourFaja

Trả lời

26
"How now <fizz>brown</fizz> cow.".replaceAll("<[^>]+>", "") 
+0

Rất hiệu quả và nhỏ gọn. –

6

Bạn gần như có;)

Hãy thử điều này:

str = str.replaceAll("<.*?>", "") 
+0

Tôi đã thử nghiệm nó với Notepad ++ và nó hoạt động hoàn hảo. – Johnny

2

Bạn có thể thử này quá:

str = str.replaceAll("<.*?>", ""); 

hãy có một cái nhìn vào ví dụ dưới đây để biết tốt hơn hiểu:

public class StringUtils { 

    public static void main(String[] args) { 
     System.out.println(StringUtils.replaceAll("How now <fizz>brown</fizz> cow.")); 
     System.out.println(StringUtils.replaceAll("How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow.")); 
    } 

    public static String replaceAll(String strInput) { 
     return strInput.replaceAll("<.*?>", ""); 
    } 
} 

Output:

How now brown cow. 
How now brown cow. 
+0

-1. Dấu ngoặc nhọn ('<' and '>') không có ý nghĩa đặc biệt trong các regex, vì vậy việc thoát chúng là vô nghĩa. Trong thực tế, trong một số hương vị (nhưng không phải Java) '\ <' and '\>' được sử dụng để phù hợp với ranh giới từ, do đó, "giải pháp" này sẽ làm mọi thứ tồi tệ hơn. –

+0

Cảm ơn nhận xét của bạn. Đã cập nhật giải pháp ... –

2

Trong khi có câu trả lời chính xác khác, không đưa ra bất cứ lời giải thích.

Lý do regex <.*?>.*?</.*?>|<.*?/> của bạn không hoạt động là vì nó sẽ chọn bất kỳ thẻ nào cũng như mọi thứ bên trong chúng. Bạn có thể thấy điều đó đang hoạt động trên debuggex.

Lý do nỗ lực thứ hai của bạn <.*?></.*?>|<.*?/> không hoạt động là vì nó sẽ chọn từ đầu thẻ tối đa thẻ đóng đầu tiên sau thẻ. Đó là loại một ngụm, nhưng bạn có thể hiểu rõ hơn những gì đang xảy ra in this example.

Regex bạn cần đơn giản hơn nhiều: <.*?>. Nó chỉ đơn giản là chọn mỗi thẻ, bỏ qua nếu nó mở/đóng. Visualization.

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