Schrift
[thread]7017[/thread]

"nicht-escapetes" Zeichen finden



<< >> 5 Einträge, 1 Seite
Matthias
 2005-05-28 11:57
#55148 #55148
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte ein Sonderzeichen (z.B. #) finden, das nicht durch einen Backslash "escaped" ist.

Das lässt sich sicher mit einem negativen Lookbehind lösen.
Allerdings wird damit der Fall '\\#' , also ein literaler Backslash gefolgt von einem #, fälschlicherweise als escaped erkannt.

Meine Lösung dazu finde ich allerdings recht unschön:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;

sub escaped { 
    my $string = shift;
    my $count = 0;
    $count++ if $string =~ /\\$/; 
    $count++ while $` =~ /\\$/ ;
    return ($count & 1)
}

#############################
#Aufruf:
    my $searchstring = '\#\\\#sfdgsdfgdsfg#ggg\\#';
    if ($searchstring =~ /#/ and not escaped $`)
    {
       print "# gefunden
";
    }


Ginge das auch "eleganter"?

Grüße

Matthias\n\n

<!--EDIT|Matthias|1117280087-->
Gast Gast
 2005-05-28 13:36
#55149 #55149
Lies mal die "zero-width positive look-behind assertion" in perldoc perlre nach. Das ist jedenfalls der eleganteste Weg, der mir spontan einfallen würde.
Crian
 2005-05-28 14:15
#55150 #55150
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
In einem solchen Fall habe ich die Anzahl der Escapezeichen vor dem betreffenden Zeichen gezählt. Ist diese gerade, so gilt das Zeichen, ist die Anzahl ungerade, so ist es escaped.

Mit einem regulären Ausdruck allein wirst Du da mMn nicht weit genug kommen.

In diesem Fall also ungefähr so:

Code: (dl )
m~(\\*)#~
\n\n

<!--EDIT|Crian|1117275567-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pKai
 2005-05-28 14:29
#55151 #55151
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Geht sogar in Perl4:
Code: (dl )
m/(^|[^\\])\\(\\*)\2#/
I sense a soul in search of answers.
betterworld
 2005-05-28 15:33
#55152 #55152
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Oder so:
Code: (dl )
while ($s =~ /(\\.|.)/g) { die if $1 eq "#"}
\n\n

<!--EDIT|betterworld|1117280267-->
<< >> 5 Einträge, 1 Seite



View all threads created 2005-05-28 11:57.