2012-07-13 38 views
6

Có cách nào để chuyển đổi chuỗinhóm regexp Java thay thế

"m1, m2, m3" 

như sau

"m1/build, m2/build, m3/build" 

chỉ bằng cách sử dụng phương pháp String.replaceAll(regex, replacement)?

Cho đến nay đây là nỗ lực hết sức mình:

System.out.println("m1, m2, m3".replaceAll("([^,]*)", "$1/build")); 
>>> m1/build/build, m2/build/build, m3/build/build 

Như bạn có thể nhìn thấy đầu ra là không chính xác. Tuy nhiên, bằng cách sử dụng regexp tương tự trong lệnh Linux sed cho sản lượng chính xác:

echo 'm1, m2, m3' | sed -e 's%\([^,]*\)%\1/build%g' 
>>> m1/build, m2/build, m3/build 

Trả lời

4

([^,]*) có thể phù hợp với chuỗi rỗng, nó thậm chí có thể kết hợp giữa hai không gian. Hãy thử ([^,]+) hoặc (\w+).

Một lưu ý nhỏ - bạn có thể sử dụng $0 để chỉ toàn bộ phù hợp chuỗi, tránh các nhóm bị bắt: (! Theo đúng nghĩa đen)

System.out.println("m1, m2, m3".replaceAll("\\w+", "$0/build")); 
+0

+1 Yep, có vẻ như là vấn đề: http://ideone.com/omXQF – mellamokb

5

Nếu bạn nhìn vào vấn đề từ đầu kia bạn nhận được một biểu thức tìm kiếm các thuật ngữ, thay vì cho nội dung. Biểu thức này hoạt động tốt hơn rất nhiều:

System.out.println("m1, m2, m3".replaceAll("(\\s*(,|$))", "/build$1")); 

Đây là a link to this program on ideone.

+0

Đó là cách tôi đã nghĩ đến việc thực hiện nó. Nhưng bạn không có/xây dựng và $ 1 đổi chỗ? – BlackVegetable

+1

@BlackVegetable Vì tôi là phù hợp với các terminator, không phải nội dung, '$ 1' thuộc về cuối. – dasblinkenlight

+0

Huh, rất vui được biết! Cảm ơn bạn đã làm rõ. +1 – BlackVegetable

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