Schrift
[thread]8239[/thread]

Regulärer Ausdruck

Leser: 3


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2006-08-14 20:20
#68938 #68938
Hallo,

ich habe ein Problem mit einem regulären Ausdruck: Ich möchte erkennen, ob der Inhalt einer Variable $words in Anführungszeichen eingeschlossen ist, also ob z.B. der Inhalt
Quote
"Angela Merkel"

oder
Quote
Angela Merkel

ist. Dies wollte ich mit dem regulären Ausdruck
Code: (dl )
if ($words =~ /"{2,}/g) { ... }

testen, was leider nicht funktioniert.
Hingegen wird ein einmaliges Vorkommen eines Anführungszeichens, also z.B. ein Variablen-Inhalt von
Quote
"Angela Merkel

durch einen Ausdruck von
Code: (dl )
if ($words =~ /"{1,}/g) { ... }

erkannt.

Habt ihr eine Idee, wo mein Fehler liegt? Wäre super!

Vielen Dank im Voraus!

Gruß
Andy
topeg
 2006-08-14 20:31
#68939 #68939
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
prinzipiell funktioniert das so:
Quote
$words=~/"[^"]+"/

wobei hier auch sowas gefunden wird:
Quote
Das ist "Angela Merkel"

und auch sowas
Quote
"Angela Merkel" ist in '"'

Wenn du dir sicher bist, das die Anführungszeichen sowohl am anfang als auch am ende des Stringes stehen kannst du folgendes machen:
Quote
$words=~/^"[^"]+"$/

Das findet:
Quote
"Angela Merkel"

verweigert sich aber bei solchen Sachen:
Quote
"Angela "Königin von Berlin" Merkel"


Ach nochwas:
Quote
$words=~/^".+"$/

erkennt auch
Quote
"Angela "Königin von Berlin" Merkel"

und verweiget sich bei
Quote
Angela "Königin von Berlin" Merkel
\n\n

<!--EDIT|topeg|1155573290-->
GwenDragon
 2006-08-14 20:31
#68940 #68940
User since
2005-01-17
14806 Artikel
Admin1
[Homepage]
user image
Das geht mit Lookahead.\n\n

<!--EDIT|GwenDragon|1155573317-->
renee
 2006-08-14 21:01
#68941 #68941
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Noch besser finde ich CPAN:Text::Balanced
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
AndySun
 2006-11-27 15:06
#68942 #68942
User since
2006-11-21
3 Artikel
BenutzerIn
[default_avatar]
Hallo,

vielen Dank für Eure Antworten, die mir schon sehr weitergeholfen haben! Ich hatte leider ständig Probleme mit der Registrierung, daher jetzt noch eine verspätete Antwort ;-)

[quote=renee,14.08.2006, 19:01]Noch besser finde ich CPAN:Text::Balanced[/quote]

Dies scheint sehr gut zu sein, jedoch habe ich dabei noch ein kleines Problem...

Ich greife dafür mal das Beispiel von topeg auf:
In einem Skalar $words steht
Quote
Angela "Königin von Berlin" Merkel


Nun möchte ich diese Begriffe in folgender Struktur einem Feld übergeben:
Quote
@splitwords[1] = Angela
@splitwords[2] = Königin von Berlin
@splitwords[3] = Merkel

(Die Reihenfolge spielt dabei keine Rolle.)

Dafür habe ich folgenden Code geschrieben:

Code: (dl )
1
2
3
4
5
6
7
8
9
if ($words =~ /"[^"]+"/) {
my $phrase;
my $otherwords;
($phrase, $otherwords) = extract_quotelike($words);

$phrase =~ s/"//g; #Anführungszeichen entfernen
@splitwords = split(/\s+/, $otherwords);
push (@splitwords, $phrase);
}


Dies funktioniert bei einer Eingabe von
Quote
"Königin von Berlin" Merkel

fehlerfrei, hingegen wird eine Eingabe von
Quote
Angela "Königin von Berlin"

falsch interpretiert.

Habt ihr eine Idee, woran dies liegen könnte?

Würde mich sehr über einen Tipp freuen!

Vielen Dank und Grüße

Andy
renee
 2006-11-27 15:30
#68943 #68943
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;
use Text::Balanced qw(extract_delimited);
use Data::Dumper;

my @strings = (q~Angela "Königin von Berlin" Merkel~,
q~Angela "Königin von Berlin"~,
q~"Königin von Berlin" Merkel~);

for my $text(@strings){
my @result = extract_delimited($text,'"','.*?');
print Dumper(\@result);
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2006-11-27 19:02
#68944 #68944
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn es wirklich nur darum geht, herauszufinden, ob am Anfang und Ende ein Gänsefüßchen ist, kann man auch einfach substr (siehe perldoc -f substr) nehmen. Das ist dann zwar vielleicht etwas laenger zu schreiben, aber für Anfänger leichter verständlich und höchstwahrscheinlich auch schneller in der Ausführung.

Code: (dl )
1
2
3
if ('"' eq substr($word, 0, 1) && '"' eq substr($word, -1, 1)) {
...
}

(ungetestet)
bloonix
 2006-11-27 19:40
#68945 #68945
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use strict;
use warnings;
use Data::Dumper;

my @strings = (
  'Die Angela "Koenigin von Berlin" Merkel ...',
  'Die Angela "Koenigin von Berlin" ...',
  'Die "Koenigin von Berlin" Merkel ...',
  'Die "Angela" Koenigin von Berlin "Merkel" ...'
);

print "--------> BEISPIEL 1\n";

# wenn du "Die Angela" ebenfalls durch Whitespaces trennen moechtest
for my $text (@strings) {
  my @result;
  for my $splitted (split /(".+?")/, $text) {
     if ($splitted =~ /^".+"$/) {
        $splitted =~ s/"//g;
        push @result, $splitted;
     } else {
        push @result, split /\s+/, $splitted;
     }
  }
  print Dumper(\@result);
}

print "\n--------> BEISPIEL 2\n";

# wenn du "Die Angela" nicht durch Whitespaces trennen moechtest
for my $text (@strings) {
  my @result;
  for my $splitted (split /(".+?")/, $text) {
     $splitted =~ s/"//g;
     push @result, $splitted;
  }
  print Dumper(\@result);
}


--------> BEISPIEL 1
$VAR1 = [
         'Die',
         'Angela',
         'Koenigin von Berlin',
         '',
         'Merkel',
         '...'
       ];
$VAR1 = [
         'Die',
         'Angela',
         'Koenigin von Berlin',
         '',
         '...'
       ];
$VAR1 = [
         'Die',
         'Koenigin von Berlin',
         '',
         'Merkel',
         '...'
       ];
$VAR1 = [
         'Die',
         'Angela',
         '',
         'Koenigin',
         'von',
         'Berlin',
         'Merkel',
         '',
         '...'
       ];

--------> BEISPIEL 2
$VAR1 = [
         'Die Angela ',
         'Koenigin von Berlin',
         ' Merkel ...'
       ];
$VAR1 = [
         'Die Angela ',
         'Koenigin von Berlin',
         ' ...'
       ];
$VAR1 = [
         'Die ',
         'Koenigin von Berlin',
         ' Merkel ...'
       ];
$VAR1 = [
         'Die ',
         'Angela',
         ' Koenigin von Berlin ',
         'Merkel',
         ' ...'
       ];
\n\n

<!--EDIT|opi|1164656155-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
AndySun
 2006-12-12 13:41
#68946 #68946
User since
2006-11-21
3 Artikel
BenutzerIn
[default_avatar]
Hallo,

vielen Dank für Eure zahlreichen Vorschläge! Ich habe den Vorschlag von opi umgesetzt, der auch einwandfrei funktioniert. Genau das brauchte ich :-)

Sorry renee, Dein Vorschlag funktionierte irgendwie nicht ganz ;-)

Grüße

Andy
renee
 2006-12-12 14:21
#68947 #68947
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was hat daran nicht funktioniert? Mit welchen Daten?

Ich frage nur aus reiner Neugier, dann kann ich etwas gezielter mit Text::Balanced "spielen"...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-08-14 20:20.