Eu sou um novato para regex Java. Eu tenho uma longa seqüência que contém um texto como este (Abaixo é apenas a parte da minha corda, que eu gostaria de substituir):
href="javascript:openWin('Images/DCRMBex_01B_ex01.jpg',480,640)"
href="javascript:openWin('Images/DCRMBex_01A_ex01.jpg',480,640)"
href="javascript:openWin('Images/DCRMBex_06A_ex06.jpg',480,640)"
Eu gostaria de substituir
Images
com
http://google.com/Images
Para, por exemplo. minha saída deve ficar assim:
href="javascript:openWin('http://google.com/Images/DCRMBex_01B_ex01.jpg',480,640)"
Abaixo está o meu programa Java:
import java.io.FileReader;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main2 {
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new FileReader("C:\\Projects\\input.txt"));
StringBuilder sb = new StringBuilder();
while (in.hasNext()) {
sb.append(in.next());
}
String patternString = "href=\"javascript:openWin(.+?)\"";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(sb);
while (matcher.find()) {
//System.out.println(matcher.group(1));
//System.out.println(matcher.group(1).replaceAll("Images", "http://google.com/Images"));
matcher.group(1).replaceAll("Images", "http://google.com/Images");
}
System.out.println(sb);
}
}
Abaixo está o meu arquivo de entrada (input.txt). Esta é apenas uma parte do meu arquivo. O arquivo é muito longo para colar aqui:
<td valign="top"><a href="http://www.google.com/cds/desktop/documents/DCRMBex/DCRMBex_01_ex01.pdf"><b>Example 1: Bible (Rusch)</b></a> � <a href="javascript:openWin(&#39;Images/DCRMBex_01A_ex01.jpg&#39;,480,640)">Figure 1A. First page of text</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_01B_ex01.jpg&#39;,480,640)">Figure 1B. Source of supplied title</a></td>
<td valign="top">&nbsp;&nbsp;</td>
<td valign="top"><a href="http://www.google.com/cds/desktop/documents/DCRMBex/DCRMBex_06_ex06.pdf"><b>Example 6: Angelo Carletti</b></a> � <a href="javascript:openWin(&#39;Images/DCRMBex_06A_ex06.jpg&#39;,480,640)">Figure 6A. Title page</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_06B_ex06.jpg&#39;,480,640)">Figure 6B. Colophon showing use of i/j and u/v</a></td>
</tr>
<tr>
<td valign="top"><a href="http://www.google.com/cds/desktop/documents/DCRMBex/DCRMBex_02_ex02.pdf"><b>Example 2: Greek anthology</b></a> � <a href="javascript:openWin(&#39;Images/DCRMBex_02A_ex02.jpg&#39;,480,640)">Figure 2A. First page of text</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_02B_ex02.jpg&#39;,480,640)">Figure 2B. Colophon</a></td>
<td valign="top">&nbsp;&nbsp;</td>
<td valign="top"><a href="http://www.google.com/cds/desktop/documents/DCRMBex/DCRMBex_07_ex07.pdf"><b>Example 7: Erasmus</b></a> � <a href="javascript:openWin(&#39;Images/DCRMBex_07A_ex07.jpg&#39;,480,640)">Figure 7A. Title page</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_07B_ex07.jpg&#39;,480,640)">Figure 7B. Colophon</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_07C_ex07.jpg&#39;,640,480)">Figure 7C. Running title</a></td>
</tr>
<tr>
<td valign="top"><a href="http://www.google.com/cds/desktop/documents/DCRMBex/DCRMBex_03_ex03.pdf"><b>Example 3: Heytesbury</b></a> � <a href="javascript:openWin(&#39;Images/DCRMBex_03A_ex03.jpg&#39;,480,640)">Figure 3A. Title page</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_03B_ex03.jpg&#39;,480,640)">Figure 3B. Colophon showing use of i/j and u/v</a></td>
<td valign="top">&nbsp;&nbsp;</td>
<td valign="top"><a href="http://www.google.com/cds/desktop/documents/DCRMBex/DCRMBex_08_ex08.pdf"><b>Example 8: Pliny</b></a> � <a href="javascript:openWin(&#39;Images/DCRMBex_08A_ex08.jpg&#39;,480,640)">Figure 8A. Title page</a> � <a href="javascript:openWin(&#39;Images/DCRMBex_08B_ex08.jpg&#39;,480,640)">Figure 8B. Colophon</a></td>
Resultado:
1) System.out.printlnl (matcher.group (1))
(&#39;Images/DCRMBex_05_ex05.jpg&#39;,480,640)
2) System.out.printlnl (matcher.group (1) .replaceAll ( "Images", " http://google.com/Images "));
(&#39;http://google.com/Images/DCRMBex_05_ex05.jpg&#39;,480,640)
Mas quando eu imprimir o meu struingbuilder, ele não mostra qualquer substituição. O que estou fazendo de errado aqui? Qualquer ajuda é apreciada. obrigado
Eu recomendaria usar Files.lines()
e Vapor Java para modificar a entrada. Com a sua entrada real você também não precisa de um regex:
try (Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
String result = lines
.map(line -> line.replace("Images", "http://google.com/Images"))
.collect(Collectors.joining("\n"));
System.out.println(result);
}
Se você realmente quiser usar um regex Eu recomendaria usar um padrão fora do loop, porque String.replaceAll()
compila internamente o padrão cada vez que você chamá-lo. Assim, o desempenho é muito melhor se você não fizer Pattern.compile()
para cada linha:
Pattern pattern = Pattern.compile("(href=\"javascript:openWin.*)(Images.*\")");
try (Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
String result = lines
.map(pattern::matcher)
.map(matcher -> matcher.replaceAll("$1http://google.com/$2"))
.collect(Collectors.joining("\n"));
System.out.println(result);
}
Usando este regex para a substituição que irá criar dois grupos (entre ()
). Você pode usar esses grupos na sua cadeia de substituição usando $index
. Então, $1
irá inserir o primeiro grupo.
O resultado em ambos os casos será:
href="javascript:openWin(&#39;http://google.com/Images/DCRMBex_01B_ex01.jpg&#39;,480,640)"
href="javascript:openWin(&#39;http://google.com/Images/DCRMBex_01A_ex01.jpg&#39;,480,640)"
href="javascript:openWin(&#39;http://google.com/Images/DCRMBex_06A_ex06.jpg&#39;,480,640)"