Я не думаю, что регулярное выражение является подходящим инструментом для этой работы, но что-то вроде этого будет "работать" иногда.
String text =
" <rect width='10px' height ='20px'/> \n" +
" <rect width='20px' height ='22px'/> \n" +
" <circle radius='20px' height ='22px'/> \n" +
" <square/> <rectangle></rectangle> \n" +
" <foo @!(*#&^#@/> <bar (!@*&(*@!#> </whatever>";
System.out.println(
text.replaceAll("<([a-z]+)([^>]*)/>", "<$1$2></$1>")
);
Приведенные выше фрагменты кода Java:
<rect width='10px' height ='20px'></rect>
<rect width='20px' height ='22px'></rect>
<circle radius='20px' height ='22px'></circle>
<square></square> <rectangle></rectangle>
<foo @!(*#&^#@></foo> <bar (!@*&(*@!#> </whatever>
Это регулярное выражение ( см. Также на rubular.com ):
/<([a-z]+)([^>]*)\/>/
По сути, мы пытаемся захватить, как мы надеемся, имя тега в группе 1 и все остальное до />
в группе 2, и использовать эти захваченные строки в нашей замене.
Ссылки