2016-05-02 19 views
1

Ich mache ein Hangman-Spiel. Ich möchte alle Buchstaben (Klein- und Großbuchstaben) in Unterstriche ändern. Hier ist mein Code:Wie alle Buchstaben zu Unterstrich zu ersetzen

_answer = "HANGMAN"; 
    Log.i("Word", "Answer orig: " + _answer); 
    _answer = _answer.replaceAll("/[a-zA-Z]+/g", "_"); 
    Log.i("Word", "Answer underscore: " + _answer); 

Die Ausgabe lautet:

Answer orig: HANGMAN 
Answer underscore: HANGMAN 

Mein Code nicht die Buchstaben ersetzen zu unterstreichen.

+1

zunächst den führenden entfernen und Hinter '/' und 'g' von der Regex. Sie gehören nicht dorthin. Sie werden von anderen Sprachen als Alternative zum Zitieren und zum Festlegen von Optionen verwendet. – Andreas

+0

Ja, das sind Perl/vim. Java verwendet diese Syntax nicht. – markspace

+0

Wenn Sie versuchen, das Hangman-Spiel zu entwickeln, ist es viel einfacher, ein einfaches 'char'-Array zu verwenden, um die' _answer' zu halten, wie Sie es nennen. Array-Lookup wird viel schneller und weniger fehleranfällig als ein Regex. Darüber hinaus werden Sie in jeder Phase feststellen, dass die Verwaltung der Regex mühsam wird, wenn die Charaktere erraten werden. – Nosh

Antwort

10

Sie müssen "jeden" Buchstaben in einen Unterstrich ändern.

public static void main(String[] args) throws Exception { 
    String _answer = "HANGMAN"; 
    _answer = _answer.replaceAll("[a-zA-Z]", "_"); // replace each letter with an "_" 
    System.out.println(_answer); 

} 

O/P:

_______ 

Hinweis: Sie können auch (?i) verwenden, um es -insensitive Fall zu machen

_answer = _answer.replaceAll("(?i)[a-z]", "_"); 
1

In einigen Programmiersprachen, können Sie einen regulären Ausdruck wie folgt angeben :

/[a-zA-Z]+/g 

Dies ist eine sprachspezifische Syntax zum Definieren einer Regex, und g bedeutet "global", d.h. so oft wie nötig wiederholen.

In Java wird eine Regex als String-Literal angegeben. Es gibt keine spezielle Regex-Syntax.

Die g Option nicht verwendet wird, aber Sie das gleiche Verhalten erhalten, indem die richtige Methode der Wahl: replaceFirst() bedeutet nur einmal, und [replaceAll()][1] ist das gleiche wie die g (global) Option angeben.

Also, replaceAll("/[a-zA-Z]+/g", "_") sollte replaceAll("[a-zA-Z]+", "_") sein.

Wenn Sie nicht die g hätten, hätten Sie replaceFirst("[a-zA-Z]+", "_") verwendet.


Allerdings sagte man „alle Buchstaben ändern (Groß- und Klein) zu unterstreichen“. Meinst du "alle Buchstaben zu einem einzigen Unterstrich" (was du versuchst zu tun), oder meintest du "jeder Brief an einen Unterstrich"?

Wenn letzteres, eine davon verwenden:

replaceAll("[a-zA-Z]", "_") 
replaceAll("(?i)[a-z]", "_")  // Flag: CASE_INSENSITIVE 
replaceAll("\\p{Alpha}", "_")  // POSIX: An alphabetic character [\p{Lower}\p{Upper}] 

// For non-english letter support: 
replaceAll("(?U)\\p{Alpha}", "_") // Flag: UNICODE_CHARACTER_CLASS 
replaceAll("\\p{L}", "_")   // Unicode letter category 
-1
public static void main(String[] args) 
{ 
    String word = "HUNUMAN"; 
    StringBuilder gletters = new StringBuilder("_"); 
    String mainword = word.replaceAll("[^" + gletters + "]", "_"); 
    System.out.println(mainword); 
} 
+0

Warum überhaupt mit String Builder zu tun haben? – karina

+0

Das würde alle Zeichen (nicht nur Buchstaben) durch _ ersetzen – Henry

Verwandte Themen