2016-05-15 5 views
1

Я хочу выделить весь текст между <h3> и /h3> <. После выбора мне нравится заменить значение моей String на результат. В следующем примере результат должен быть Базовая информацияRegex using result for replace String

String test="<h3>Basic Information</h3> <div>"; 
test = test.replaceAll("<h3>(.*?)</h3>", "$1"); 

Но на данный момент результат

Базовая информация & л; DIV & GT;

+1

Я не понимаю, почему вы ожидаете получить только * «Базовая информация» * в результате с помощью этого кода. Вы уверены, что 'replaceAll' действительно то, что вы хотите? Возможно, вам скорее нужно извлечь спичку вместо ее замены. –

ответ

4

С регулярных выражений вы можете сделать:

String test="<h3>Basic Information</h3> <div>"; 
String repl = test.replaceFirst(".*<h3>([^&]+).*/h3> <.*", "$1"); 
//=> Basic Information 

Хотя вы можете избежать регулярных выражений вообще и использовать String API, чтобы извлечь тот же текст, а также.

В качестве альтернативы вы можете использовать это регулярное выражение для сравнения:

<h3>([^&]+).*/h3> < 

и захватить в плен группу # 1 с помощью Pattern и Matches API.

+0

Да, одним примером может быть использование разделов String только ради производительности. Если не использовать, если для чего-то большего. На самом деле это xml-фрагменты, поэтому, если они становятся достаточно большими, возможно, SAX-парсер может лучше справиться с этой задачей. –

1

Попробуйте это:

Pattern pattern = Pattern.compile("<h3>(.*)<\\/h3>"); 
Matcher matcher = pattern.matcher("<h3>Basic Information</h3> <div>"); 
matcher.find(); 
StringBuffer sb = new StringBuffer(); 
matcher.appendReplacement(sb,"$1"); 
String result = sb.toString(); 

Причина, почему вы не можете сделать это только с replaceFirst это потому, что метод appendTail вызывается в конце метода replaceFirst. Матчи заменят группы, которые вы не указали с пустым, группы, которые вы указали с их значением и, конечно, несогласованные биты, которые, так как для них не было найдено совпадений, они не заменяются на все.

В случае Вашего запроса:

группы 0: <h3>

группа 1: Базовая информация

группа 0: </h3 >

non-match: <div>

Это всего лишь общий пример того, что вы можете сделать с помощью шлемов. Конечно, если вы просто хотите, чтобы группа была специфической ... Ну, просто используйте:

+0

Зачем использовать 'StringBuffer' вместо вызова' group (1) '?И 'sb.toString;' недействителен java. – RealSkeptic

+0

Это всего лишь пример. Конечно, вы можете использовать для этого группу. Я имею в виду, если вы просто хотите заменить группы, не имея непревзойденных строк, то StringBuffer все же лучше. Если вам просто нужна одна конкретная группа ... ну просто получите группу. Я только что отредактировал его. –

+0

@RealSkeptic btw, позаботьтесь, чтобы объяснить, что вы подразумеваете под 'sb.toString()' is not Java? AFAIK, содержимое 'StringBuffer' преобразуются в строку методом' toString() '. –