regex - mehrmaliges vorkommen
Boris
- perl
kurze frage.
Wie prüfe ich, ob ein buchstabe in einem string mehrmals vorkommt? Also sowohl in folge, als auch irgendwo anders im string.
Beispiel:
$b = "AABCDCEF";
Ich kann für A das + nehmen. Aber wie finde ich vorkommen wie C? Ich meine jetzt nich lösungen wie C[A-Z]+C sondern allgemeinere. Muss ich mein muster gierig machen und dann die anzahl feststellen? oder geht das einfacher? Ich suche sowas wie + aber nicht in folge. Ich würde das gerne über eine gruppe von Buchstaben ... [A-H]findeVorangegengenesZeichenMehrmalsImGesamtenString ... lösen.
Ist meine frage jetzt SEHR dumm?
Hi,
Wie prüfe ich, ob ein buchstabe in einem string mehrmals vorkommt? Also sowohl in folge, als auch irgendwo anders im string.
Wenn du nur pruefen willst, ob es mehrmals vorkommt kannst du fuer A beispielsweise /A.*A/ verwenden.
Beispiel:
$b = "AABCDCEF";
Ich kann für A das + nehmen. Aber wie finde ich vorkommen wie C?
/C.*C/
Ich meine jetzt nich lösungen wie C[A-Z]+C sondern allgemeinere.
Was verstehst du unter allgemeiner?
Willst du die genaue Anzahl, oder nur wissen, ob das Zeichen mehrmals vorkommt.
Zum zaehlen kannst du auch die Funktion index() in Kombination mit einer Schleife benutzen.
Muss ich mein muster gierig machen und dann die anzahl feststellen?
Wenn du + verwendest ist dein Muster gierig. Nicht gierig waere es, wenn du C[A-Z]+?C schreibst.
oder geht das einfacher? Ich suche sowas wie + aber nicht in folge. Ich würde das gerne über eine gruppe von Buchstaben ... [A-H]findeVorangegengenesZeichenMehrmalsImGesamtenString ... lösen.
Koenntest du mal ein Beispiel machen, in welchem String was genau gefunden werden soll?
Ist meine frage jetzt SEHR dumm?
Fuer mich vielleicht etwas unklar.
mfG,
steckl
Wie prüfe ich, ob ein buchstabe in einem string mehrmals vorkommt? Also sowohl in folge, als auch irgendwo anders im string.
Mit Hilfe des g-Modifiers:
my $text = 'AABCDCEFC';
# g-Modifier und Listenkontext
my @anz = ( $text =~ /C/g );
# $#array liefert die höchste Indexnummer von @array und
# muss um 1 erhoeht werden, da der Arrayindex bei 0 beginnt
print 'C ', $#anz + 1, ' mal gefunden';
Siehe perlretut.
Siechfred
»» # g-Modifier und Listenkontext
my @anz = ( $text =~ /C/g );
Geht auch kürzer und spart das Hochzählen:
~~~perl
my $anz = my @anz = ( $text =~ /C/g );
print 'C ', $anz, ' mal gefunden';
Oder habe ich dich falsch verstanden?
Siechfred
Ich möchte alle möglichen permutationen eines arrays bilden, ohne dopplungen.
mein ansatz ist dabei:
@a = qw(A B C D E F G H);
foreach $stelle1 (@a){
foreach $stelle2 (@a){
foreach $stelle3 (@a){
foreach $stelle4 (@a){
foreach $stelle5 (@a){
$b[@b] = $stelle1.$stelle2.$stelle3.$stelle4.$stelle5;
}}}}}
in der mitte der verschachtelung würde ich gerne DIE $b auslassen, in denen irgendein buchstabe doppelt vorkommt.
ist mein ansatz falsch?
vielen dank euch beiden jedenfalls bis hierhin.
Ich möchte alle möglichen permutationen eines arrays bilden, ohne dopplungen.
mein ansatz ist dabei:
Auch wenn nicht ganz verstehe, was das heißt, würde ich sagen du willst einfach einen HASH verwenden.
Struppi.
Auch wenn nicht ganz verstehe, was das heißt, würde ich sagen du »»willst einfach einen HASH verwenden.
weiss nicht.
Ich glaube wenn ich den arrayinhalt als HASH-name verwende, vermeide ich nur doppelte arrays. Mein problem ist aber ein anderes.
aber viellecht irre ich mich auch oder ich verstehe nicht wie ich in meinem fall die HASH-erzeugung anwenden muss.
aber viellecht irre ich mich auch oder ich verstehe nicht wie ich in meinem fall die HASH-erzeugung anwenden muss.
vielleicht irre ich mich auch, da ich - wie gesagt - nicht genau verstehe, was du exakt willst.
Ich möchte alle möglichen permutationen eines arrays bilden, ohne dopplungen.
mein ansatz ist dabei:
die Frage ist, woher kommen denn die Dopplungen?
Wie erzeugst du denn die Kombinationen?
Struppi.
die Frage ist, woher kommen denn die Dopplungen?
Wie erzeugst du denn die Kombinationen?
Durch verschachtelten foreachs
foreach $stelle1 (@a){
foreach $stelle2 (@a){
foreach $stelle3 (@a){
foreach $stelle4 (@a){
foreach $stelle5 (@a){
$b[@b] = $stelle1.$stelle2.$stelle3.$stelle4.$stelle5;
}}}}}
Es geht nicht um doppelte arrays, sondern um doppelte buchstaben innerhalb eines strings.
Ich glaube ich muss irgendwie mit mehrdimensionalen arrys arbeiten ... habe aber mit deren anwendung und wirkung NULL erfahrung. Darum sieht mein code wohl etwas unbeholfen aus.
Durch verschachtelten foreachs
Das würde flexibler mit einer rekursiven Funktion gehen.
foreach $stelle1 (@a){
foreach $stelle2 (@a){
foreach $stelle3 (@a){
foreach $stelle4 (@a){
foreach $stelle5 (@a){$b[@b] = $stelle1.$stelle2.$stelle3.$stelle4.$stelle5;
Was ist denn @b? in die Klammer gehört üblicherwiese der Indes, also eine Zahl.
Es geht nicht um doppelte arrays, sondern um doppelte buchstaben innerhalb eines strings.
das kannst du doch ohne Probleme in die Schleifen einbauen.
Struppi.
Was ist denn @b? in die Klammer gehört üblicherwiese der Indes, also »» eine Zahl.
@b liefert die gesamtanzahl der Arrays, also je nach durchlauf 0,1,2...
könnte man sicher auch mit push machen.
Es geht nicht um doppelte arrays, sondern um doppelte buchstaben innerhalb eines strings.
das kannst du doch ohne Probleme in die Schleifen einbauen.
ja, aber dann müsste ich alle $stellenX aufwändig mit if gegenainander prüfen. Darum war ja mein ansatz, den erzeugten string auf dopplungen innerhalb des strings selber zu checken.
oder verstehe ich dich falsch?
Willst du sowas?
use Algorithm::Permute;
my @array = qw(A B C D E F G H);
my $p_iterator = Algorithm::Permute->new ( \@array );
while (my @perm = $p_iterator->next) {
print "next permutation: (@perm)\n";
}
Siehe How do I permute N elements of a list?
Siechfred
Willst du sowas?
JAAAAA! 1000 dank!
muss ich erstmal verarbeiten ... aber DAS scheint es zu sein!
DANKE :))))
Hallo.
Deine ursprüngliche Frage scheint mir noch nicht beantwortet zu sein.
Wie prüfe ich, ob ein buchstabe in einem string mehrmals vorkommt? Also sowohl in folge, als auch irgendwo anders im string.
Der reguläre Ausdruck des folgenden Beispiels dürfte genau das tun, was du ursprünglich wolltest:
my $str = 'ABCDCEF'; # C ist doppelt
if($str =~ /(\w).*?\1/) {
print "Der Buchstabe $1 kommt doppelt vor.";
}
else {
print "Keiner der Buchstaben kommt doppelt vor.";
}
Teilzeichenketten, die durch runde Klammern innerhalb des regulären Ausdrucks zwischengespeichert werden, sind nicht nur über die Variablen $1
, $2
, $3
, usw. verfügbar, nachdem die RegEx ausgeführt wurde. Vielmehr können diese zwischengespeicherten Werte bereits in der RegEx durch die Verwendung der Maskierungen \1
, \2
, \3
, usw. verwendet werden.
Schöne Grüße.