[Regex] Deel van regex matchen, maar alleen aaneengesloten

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 26-03 21:19
De titel is misschien wat vaag, maar ik weet niet goed hoe ik mn probleempje moet omschrijven.

Ik probeer een regular expression om uit een wordlist woorden te halen die in een telefoonnummer voorkomen (naambellen).

Nu heb ik al een script dat van een nummer een regex maakt:
code:
1
2
3
4
5
6
0 : 0
1 : 1
2 : 2abcABC
3 : 3defDEF
...
9 : 9wxyzWXYZ


Dit wordt dan bijvoorbeeld alsvolgt in een regex gezet (06-12345678):
code:
1
^[0][6mnoMNO][1][2abcABC][3defDEF][4ghiGHI][5jklJKL][6mnoMNO][7pqrsPQRS][8tuvTUV]$


Nu wil ik echter uit de wordlist ook woorden halen die in een deel voorkomen, dus bijvoorbeeld:
0612, of 123, of 567
Helaas kan dat niet door simpelweg ? te plaatsen, dan matcht namelijk ook bijvoorbeeld:
06178

Bedankt

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
Ik zou het als volgt doen:
1) Wordlist omzetten; alle woorden naar getallen veranderen en linken aan woorden (hallo -> 42556)
2) Hele wordlist aflopen en controleren of getal in telefoonnummer voorkomt, zo ja, zoek dan het bijbehorende woord op

Lijkt me makkelijker dan met regexen klooien :)

  • MikeN
  • Registratie: April 2001
  • Laatst online: 03-05 16:41
code:
1
([a]([b]([c]([d])?)?)?)


Doet zoiets niet wat je wil?

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
MikeN schreef op donderdag 04 augustus 2005 @ 16:08:
code:
1
([a]([b]([c]([d])?)?)?)


Doet zoiets niet wat je wil?
Zo match je alleen a, ab, abc, of abcd, maar bijvoorbeeld niet bcd.

  • MikeN
  • Registratie: April 2001
  • Laatst online: 03-05 16:41
Ah, daar had ik even overheen gelezen in de topicstart :)

  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 26-03 21:19
JeRa schreef op donderdag 04 augustus 2005 @ 16:06:
Ik zou het als volgt doen:
1) Wordlist omzetten; alle woorden naar getallen veranderen en linken aan woorden (hallo -> 42556)
2) Hele wordlist aflopen en controleren of getal in telefoonnummer voorkomt, zo ja, zoek dan het bijbehorende woord op

Lijkt me makkelijker dan met regexen klooien :)
Dat is ook wel een goeie tip, eens kijken of ik dat voor elkaar krijg.

de vraag over die regex blijft nog wel open, is daar ook voor nodig (zoals ik t nu voor me zie)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Fl4sh3r schreef op donderdag 04 augustus 2005 @ 16:14:
de vraag over die regex blijft nog wel open, is daar ook voor nodig (zoals ik t nu voor me zie)
Voor die oplossing van JeRa heb je geen regexp nodig hoor, alleen een gewone string match-functie. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 26-03 21:19
Hoe match ik dan bijvoorbeeld 123, als ik zoek naar 01234?

Ik heb/kan Perl, PHP, Java en een beetje C#, dus als je een taal specefieke oplossing hebt in één van die talen is dat geen probleem :)

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
Er zijn een hoop stringfuncties in PHP en Java, eentje die je kunt gebruiken in PHP is strpos() :)

[ Voor 3% gewijzigd door JeRa op 04-08-2005 16:29 ]


  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 26-03 21:19
Duidelijk te lang vakantie gehouden...

Moet er echt weer ff inkomen. Bedankt allemaal

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Simpel: verwijder de ^ en $ uit je regex. Die zorgen namelijk dat je tegen het begin en eind van je pattern space matcht. "6" is een regex die ook "0612" matcht. "^06" is ook een regex die "0612" matcht, maar "^6" niet.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Je benadert 't gewoon van de verkeerde kant. Je moet niet het telefoonnummer op de string gaan matchen, maar andersom. Wat is makkelijker, 061234567 ombouwen tot regex en laten matchen op 1234 of 1234 laten matchen op 061234567 ?

Zoals eerder gezegd heb je dan helemaal geen regex nodig.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 26-03 21:19
drm schreef op donderdag 04 augustus 2005 @ 17:08:
Je benadert 't gewoon van de verkeerde kant. Je moet niet het telefoonnummer op de string gaan matchen, maar andersom. Wat is makkelijker, 061234567 ombouwen tot regex en laten matchen op 1234 of 1234 laten matchen op 061234567 ?

Zoals eerder gezegd heb je dan helemaal geen regex nodig.
Zo heb ik het inmiddels gedaan.

Convert script is in perl
code:
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
#!/usr/bin/perl

open(MYFILE, "wordlist2.txt");
@lines = <MYFILE>;
close(MYFILE);

foreach $line (@lines) {
  chomp($line);
  $org = $line;

  next if ($line =~ /[^a-zA-Z0-9]/);
  next if (length($line) > 9);

  $line =~ s/[abc]/2/ig;
  $line =~ s/[def]/3/ig;
  $line =~ s/[ghi]/4/ig;
  $line =~ s/[jkl]/5/ig;
  $line =~ s/[mno]/6/ig;
  $line =~ s/[pqrs]/7/ig;
  $line =~ s/[tuv]/8/ig;
  $line =~ s/[wxyz]/9/ig;

  if($line ne $org) {
    print $org . "|" . $line . "\n";;
  }

}


Het check script is in php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
  $phonenr = '0612345678';

  $fh = fopen('wordlist2_conv.txt', 'r');

  while(!feof($fh)) {
    $line = rtrim(fgets($fh));

    list($word, $nr) = split('\|', $line);

    if(($n = strpos($phonenr, $nr)) !== false) {
      print substr($phonenr, 0, $n) . $word . substr($phonenr, $n+strlen($word))."\n";
    }
  }
?>
Pagina: 1