2009-06-26 2 views
1

Was ich suchen, ist eine RegEx zum Mischen der Zeichenfolge einer bestimmten Zeichenfolge für den Einsatz in Funktionstests.RegEx zum zufälligen Festlegen der Groß-/Kleinschreibung von Zeichen in einer Zeichenfolge

Beispiel Eingabe:

The Quick Brown fox jumps over the Lazy Dog. 

Probe Erwartete Ausgabe:

tHe QUiCk BrOwn FoX jUMPs OvER tHe lAzY dOg. 

Es wäre schön, wenn die Ausgabe der RegEx angewendet wurden jedes Mal anders war. Um zum Beispiel des oben Eingang gegeben, ein anderes Mal der RegEx angewandt wurden, kann der Ausgang sein:

THe qUIcK bROwN fOX JuMpS oVeR THe lAzy DoG. 

Ich weiß, dass es einfach wäre, einfach eine Substitutionstabelle einrichten (zB ‚x‘ => ' X ',' B '=>' b '), aber das ist nicht das, wonach ich suche.

Ich habe eine Google-Suche für diese und kam mit nichts, obwohl ich weiß, dass es getan wurde. Ich hatte Code (jetzt verloren), der das tat.

+3

Gibt es einen Grund, warum Sie die Zeichen in der Zeichenfolge nicht durchlaufen können und Fall auf diese Weise zufällig festlegen? Welche Sprache? –

Antwort

2

in Perl diese

perl -e ‚$ _ = "The quick brown fox jumps over the lazy dog" arbeitet; s/([a -zA-Z])/rand() < .5? uc ($ 1): lc ($ 1)/ge; print‘

es lief ein paar Mal ...

  • Der schnelle braune Fuchs springt über den lazy dog ​​
  • Der schnelle braune Fuchs Springt im Laufe des faulen Hunds
  • der schnelle braune Fuchs über den faulen Hund springt
  • der schnelle braune Fuchs springt über die lazy dog ​​
  • des Quick brown Fuchs springt über den lazy dog ​​
  • Der schnelle braune Fuchs springt über den fauler Hund
  • Der schnelle braune Fuchs springt über den lazy dog ​​
  • Der schnelle braune Fuchs springt über den lazy dog ​​
+0

Doppel-plus danke! – BryanH

4

RegEx soll etwas deterministisch und nicht zufällig tun. In C# können Sie es erreichen so etwas wie dies mit:

var random = new Random(); 
var result = new string(((IEnumerable<char>)input.ToLowerInvariant()) 
       .Select(x => random.Next(2) == 0 ? x : Char.ToUpperInvariant(x)) 
       .ToArray()); 
+1

Ernsthaft. Die einfache Antwort ist "Do not". –

+0

@Daniel: Ich kann mir einige mögliche Anwendungsfälle für Spammer vorstellen;) –

+0

Danke dafür - aber C# ist Betriebssystem-spezifisch. Ich betreibe das nicht auf einer Fenstermaschine; meistens läuft es auf einer kopflosen Linux-Box (die Installation von X + Wine/Mono, nur um einen Funktionstest durchzuführen, wird nicht passieren). – BryanH

0

Reguläre Ausdrücke sind großartig, aber sie sind nicht immer die beste Lösung. Hier

ist einige einfache pseudo-Skript zu tun, was Sie wollen:

Die einzige Regex hier ist in der Split-Funktion - zur Umwandlung in ein Array von Zeichen. Da viele Sprachen Sie eine Zeichenfolge als ein Array von Zeichen behandeln können, ist dieses Bit möglicherweise nicht einmal erforderlich.

MyArray = MyString.split('[\b\B]') 

for each (Character in MyArray) 
{ 
    if (Random(0,1) > 0.5) 
    { 
     Character = Uppercase(Character) 
    } 
    else 
    { 
     Character = Lowercase(Character) 
    } 
} 

MyString = MyArray.join() 
0

Es muss kein regexp sein.In Python:

>>> from random import choice 
>>> a = "lorem ipsum dolor sic amet" 
>>> ''.join(choice((c.lower, c.upper))() for c in a) 
'LoREM ipSum DoloR sic AmEt' 
Verwandte Themen