2011-10-05 16 views
24

W tej chwili robięNajbardziej skutecznym sposobem korzystania zastąpienie wielu słów w ciąg

Przykład:

line.replaceAll(",","").replaceAll("cat","dog").replaceAll("football","rugby"); 

myślę, że to brzydkie. Nie masz lepszego sposobu na zrobienie tego? Może pętli przez Hashmap?

EDIT:

Poprzez sprawność znaczy lepszy styl kodu i elastyczność

+3

Czy masz pytanie dotyczące wydajności środowiska wykonawczego? Elastyczność?Styl kodu? Proszę o wyjaśnienie. – Mac

+2

Może to być również kwestia poprawności, ponieważ zamienniki wykonane podczas N przejść mogą nie być równoważne zastępowaniu N par podczas pojedynczego przejścia. – Xion

+2

Zaktualizowane pytanie, ale szukasz kodu, który ma być lepiej stylizowany i pozwolić na elastyczność – Decrypter

Odpowiedz

4

oprócz że rzeczywista zastąpić jest wewnętrznie konwertowane na regex myślę, że podejście jest w porządku. Implementację bez regex można znaleźć w StringUtils.replace(..).

Patrząc, jakie alternatywy mogą być, nadal potrzebujesz czegoś, aby zidentyfikować pary strun. Mogłoby to wyglądać tak:

MultiReplaceUtil.replaceAll{line, 
     {",", ""}, {"cat", "dog"}, {"football", "rugby"}}; 

czy może

MapReplaceUtil(String s, Map<String, String> replacementMap); 

lub nawet

ArrayReplaceUtil(String s, String[] target, String[] replacement); 

z których żadna nie wydaje się bardziej intuicyjne dla mnie jeśli chodzi o kodowanie praktyki.

20

Można użyć Matcher.appendReplacement()/appendTail() do budowy bardzo elastycznych funkcji wyszukiwania i zamiany.

Przykład w JavaDoc wygląda następująco:

Pattern p = Pattern.compile("cat"); 
Matcher m = p.matcher("one cat two cats in the yard"); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(sb, "dog"); 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 

Teraz wewnątrz tego while pętli można zdecydować się jaki jest tekst wymiana i baza że informacja o rzeczywistej zawartości są dopasowane.

Na przykład można użyć wzoru (,|cat|football) dopasować ,, catlubfootball i zdecydować się na rzeczywistej wymianie opartej na rzeczywistej meczu wewnątrz pętli.

Możesz budować jeszcze bardziej elastyczne rzeczy w ten sposób, takie jak zastąpienie wszystkich liczb dziesiętnych liczbami szesnastkowymi lub podobnymi operacjami.

To nie tak krótki i prosty jako kodu, ale można budować krótkie i proste metody z nim.

21

Ta funkcja jest już zaimplementowana w klasie Commons Lang o nazwie StringUtils.

StringUtils.replaceEach(String text, String[] searchList, String[] replacementList) 
+1

Uważam, że nie jest to w standardowej bibliotece, ale raczej w Apache Commons [link] (https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#replaceEach%28java.lang.String,%20java.lang.String [] ,% 20java.lang.String []% 29) – tkokasih

+0

Nowa wersja to ['StrSubstitutor'] (https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/ commons/text/StrSubstitutor.html) z [Apache Commons Text] (https://commons.apache.org/proper/commons-text/). – Andreas

1

Dla miłośników Scala:

"cat".r.replaceAllIn("one cat two cats in the yard", m => "dog") 

Z m można nawet parametryzacji zamiennika.

Powiązane problemy