Hoe vervang ik een teken in een tekenreeks in Java?

Met Java wil ik door de regels van een tekst gaan en alle ampersand-symbolen (&) vervangen door de XML-entiteitsreferentie &.

Ik scan de regels van de tekst en vervolgens elk woord in de tekst met de Scanner-klasse. Vervolgens gebruik ik de CharacterIteratorom elk karakter van het woord te herhalen. Hoe kan ik het personage echter vervangen? Ten eerste zijn Strings onveranderlijke objecten. Ten tweede wil ik een teken (&) vervangen door meerdere tekens (amp&;). Hoe moet ik dit aanpakken?

CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
       if(ch == '&') {
       }
}

Antwoord 1, autoriteit 100%

Probeer in plaats daarvan String.replace()of String.replaceAll()te gebruiken.

String my_new_str = my_str.replace("&", "&");

(Beide vervangen alle instanties; replaceAllstaat het gebruik van regex toe.)


Antwoord 2, autoriteit 71%

Het simpele antwoord is:

token = token.replace("&", "&");

Ondanks de naam in vergelijking met ReplaceAll, doet vervangen wel een ReplaceAll, het gebruikt gewoon geen reguliere expressie, wat hier op zijn plaats lijkt te zijn (zowel vanuit een prestatieperspectief als vanuit het oogpunt van een goede praktijk – gebruik geen regular uitdrukkingen per ongeluk omdat ze speciale tekenvereisten hebben waar je niet op let).

Het antwoord van Sean Bright is waarschijnlijk zo goed als het waard is om over na te denken vanuit een prestatieperspectief, zonder enige verdere doelvereiste voor prestaties en prestatietests, als je al weet dat deze code een hotspot is voor prestaties, als dat is waar je vraag is afkomstig uit. Het verdient zeker geen minnetjes. Gebruik gewoon StringBuilder in plaats van StringBuffer, tenzij je de synchronisatie nodig hebt.

Dat gezegd hebbende, is er hier een wat dieper potentieel probleem. Ontsnappende tekens is een bekend probleem dat veel bibliotheken daar aanpakken. U kunt overwegen de gegevens in een CDATA-sectie in de XML te verpakken, of u kunt er de voorkeur aan geven een XML-bibliotheek te gebruiken (inclusief degene die nu bij de JDK wordt geleverd) om de XML daadwerkelijk correct te genereren (zodat deze de codering afhandelt). ).

Apache heeft ook een escape-bibliotheekals onderdeel van Commons Lang.


Antwoord 3, autoriteit 11%

StringBuilder s = new StringBuilder(token.length());
CharacterIterator it = new StringCharacterIterator(token);
for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
    switch (ch) {
        case '&':
            s.append("&");
            break;
        case '<':
            s.append("&lt;");
            break;
        case '>':
            s.append("&gt;");
            break;
        default:
            s.append(ch);
            break;
    }
}
token = s.toString();

Antwoord 4, autoriteit 7%

Misschien wilt u ook controleren of u een exemplaar vervangt dat al is vervangen. U kunt hiervoor een reguliere expressie gebruiken met een negatieve lookahead.

Bijvoorbeeld:

String str = "sdasdasa&amp;adas&dasdasa";  
str = str.replaceAll("&(?!amp;)", "&amp;");

Dit zou resulteren in de string “sdasdasa&amp;adas&amp;dasdasa“.

Het regexpatroon “& amp; (?! amp;)” zegt in feite: match eventueel “& amp; dat wordt niet gevolgd door ‘amp’.


Antwoord 5, Autoriteit 4%

Maak gewoon een tekenreeks met alle betreffende gegevens en gebruik vervolgens string.replaceall () zoals hieronder.

String result = yourString.replaceAll("&", "&amp;");

Antwoord 6

Ontsnappende strings kan lastig zijn – vooral Als u rekening wilt houden met Unicode. Ik veronderstel dat XML een van de eenvoudigere indelingen / talen is om te ontsnappen, maar toch. Ik zou aanraden een kijkje te nemen op de Snijsecapeutils-klasse in Apache Commons Lang, en de handige escapexml methode.


Antwoord 7

Probeer deze code. U kunt elk teken vervangen door een ander gegeven karakter.
Hier probeerde ik de letter ‘A’ te vervangen met “-” -karakter voor de Give String “ABCDEAA”

output – & gt; _bcdef __

   public class Replace {
    public static void replaceChar(String str,String target){
        String result = str.replaceAll(target, "_");
        System.out.println(result);
    }
    public static void main(String[] args) {
        replaceChar("abcdefaa","a");
    }
}

Antwoord 8

U kunt streamen flatMapgebruiken om &toe te wijzen aan &amp;

   String str = "begin&end";
    String newString = str.chars()
        .flatMap(ch -> (ch == '&') ? "&amp;".chars() : IntStream.of(ch))
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();

Antwoord 9

Als je Spring gebruikt, kun je eenvoudig HtmlUtils.htmlEscape(String input)aanroepen, die de ‘&’ afhandelt. naar ‘&’ vertaling.


Antwoord 10

//I think this will work, you don't have to replace on the even, it's just an example. 
 public void emphasize(String phrase, char ch)
    {
        char phraseArray[] = phrase.toCharArray(); 
        for(int i=0; i< phrase.length(); i++)
        {
            if(i%2==0)// even number
            {
                String value = Character.toString(phraseArray[i]); 
                value = value.replace(value,"*"); 
                phraseArray[i] = value.charAt(0);
            }
        }
    }

Antwoord 11

String taskLatLng = task.getTask_latlng().replaceAll( "\\(","").replaceAll("\\)","").replaceAll("lat/lng:", "").trim();

Other episodes