Regex
Hallo allemaal,
ik heb een klein vraagje.
Bestaat er misschien een mogelijkheid om in regex zelfde waardes te laten controleren?
Voorbeeld
AB AB
linker reeks en rechter reeks zijn gelijk aan elkaar dus true.(gescheiden door een spatie).
AB BA
linker reeks en rechter reeks zijn niet gelijk aan elkaar dus false.(en ook gescheiden door een spatie)
Nja, alvast bedankt
Ltrs Peter
ik heb een klein vraagje.
Bestaat er misschien een mogelijkheid om in regex zelfde waardes te laten controleren?
Voorbeeld
AB AB
linker reeks en rechter reeks zijn gelijk aan elkaar dus true.(gescheiden door een spatie).
AB BA
linker reeks en rechter reeks zijn niet gelijk aan elkaar dus false.(en ook gescheiden door een spatie)
Nja, alvast bedankt
Ltrs Peter
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
Dat kan niet met een regex zover ik weet, maar waarom met een regex?
Is het niet makkelijker om de string te explode'n op n spatie en vervolgens te kijken of de array items gelijk aan elkaar zijn.
Is het niet makkelijker om de string te explode'n op n spatie en vervolgens te kijken of de array items gelijk aan elkaar zijn.
Misschien kun je conditions gebruiken. En anders moet je toch near gebruiken.
nja ik ben een regex te maken voor mijn naam scriptje (vraag niet waarom xD)
ik heb het geprobeerd maar het lukt niet helemaal.
Het gaat om de volgende punten
*Begint met A (eerste letter van de alfabet) altijd
*A tot C dus [A-C]+
*linker reeks gelijk aan rechter reeks
*mag meerdere letters bevatten als het maar op alfabetische volgorde is en A tot C
*geen cijfers
Om een overzicht te geven heb ik zeg maar een paar voorbeelden geschreven die die zou moeten doen:
A A [goed]
AA AA [goed]
AB AB [goed]
AC AC [goed]
ABC ABC [goed]
ABBC ABBC [goed]
AABBC AABBC [goed]
ABB ABB [goed]
en wat ie niet moet doen:
a a [fout]
B B [fout]
A [fout]
AA AB [fout]
ACC ACC [fout]
BC BC [fout]
AD AD [fout]
AABBC AABB [fout]
AAA [fout]
123 123 [fout]
ABCZ ABCZ [fout]
Misschien een klein beetje hulp?
op dit moment heb ik dit:
\b([A]+|[A]+[A-C]+)\W+([A]+|[A]+[A-C]+)\b
alleen detecteert ie ook AA AB enz. :S
ik heb het geprobeerd maar het lukt niet helemaal.
Het gaat om de volgende punten
*Begint met A (eerste letter van de alfabet) altijd
*A tot C dus [A-C]+
*linker reeks gelijk aan rechter reeks
*mag meerdere letters bevatten als het maar op alfabetische volgorde is en A tot C
*geen cijfers
Om een overzicht te geven heb ik zeg maar een paar voorbeelden geschreven die die zou moeten doen:
A A [goed]
AA AA [goed]
AB AB [goed]
AC AC [goed]
ABC ABC [goed]
ABBC ABBC [goed]
AABBC AABBC [goed]
ABB ABB [goed]
en wat ie niet moet doen:
a a [fout]
B B [fout]
A [fout]
AA AB [fout]
ACC ACC [fout]
BC BC [fout]
AD AD [fout]
AABBC AABB [fout]
AAA [fout]
123 123 [fout]
ABCZ ABCZ [fout]
Misschien een klein beetje hulp?
op dit moment heb ik dit:
\b([A]+|[A]+[A-C]+)\W+([A]+|[A]+[A-C]+)\b
alleen detecteert ie ook AA AB enz. :S
'~\b(A+B*(?(?<=B)C*|))\s\1\b~'
Je hebt alleen een fout in je eerste lijstje, volgens je eigen definitie kan 'AC AC' niet, en staat daar wel.
Je hebt alleen een fout in je eerste lijstje, volgens je eigen definitie kan 'AC AC' niet, en staat daar wel.
Code (php)
@ Martin: zoals de kleurcodering hierboven al aangeeft: een variabele mag niet beginnen met een nummer.
$1 mag niet.
$e mag wel.
$1 mag niet.
$e mag wel.
En Martin,
Heb je de tweede post van de TS wel gelezen? Daarin staat namelijk dat ie nog veel meer wil checken, dan twee gelijke delen...
Heb je de tweede post van de TS wel gelezen? Daarin staat namelijk dat ie nog veel meer wil checken, dan twee gelijke delen...
@Rhichard bedankt voor je code alleen doet ie het niet echt xD
ik test mijn regex op dit site http://regexpal.com/
hij pakt het zeg maar niet :S
nja ik heb nu dit
(A^CC+|A+B+|C+|AA+)+\s(A^CC+|A+B+|C+|AA+)
en voldoet nu aan 6 goeds (i.p.v. 8) en heb 2 fouten.
ben er dus bijna maar niet helemaal.
ik test mijn regex op dit site http://regexpal.com/
hij pakt het zeg maar niet :S
nja ik heb nu dit
(A^CC+|A+B+|C+|AA+)+\s(A^CC+|A+B+|C+|AA+)
en voldoet nu aan 6 goeds (i.p.v. 8) en heb 2 fouten.
ben er dus bijna maar niet helemaal.
Ik denk niet dat dit je met een regex gaat lukken, met name door de alfabetische eis die je stelt. Dat valt niet zomaar te controleren met een regex.
Een voorbeeldje van hoe je het aan zou kunnen pakken:
Nog niet uitgebreid getest, dus het kan zijn dat er nog een paar namen tussendoor glippen. Maar ik denk dat dit wel al voldoet...
Een voorbeeldje van hoe je het aan zou kunnen pakken:
Code (php)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
function checkName($sName)
{
if($sName == '')
{
return false;
}
list($sPart1, $sPart2) = explode(' ', $sName);
if($sPart1 != $sPart2)
{
return false;
}
else
{
if($sPart1[0] != 'A')
{
return false;
}
else
{
$sPrev = $sPart1[0];
$aAllowed = range('A', 'C');
for($i = 1; $i <= strlen($sPart1); $i++)
{
if(!in_array($sPart1[$i], $aAllowed))
{
return false;
}
elseif($sPart1[$i] < $sPrev)
{
return false;
}
else
{
$sPrev = $sPart1[$i];
}
}
}
}
return true;
}
$sName = 'ABZ ABZ';
var_dump(checkName($sName)); // bool(false)
$sName = 'ABC ABC';
var_dump(checkName($sName)); // bool(true)
?>
ini_set('display_errors', 1);
error_reporting(E_ALL);
function checkName($sName)
{
if($sName == '')
{
return false;
}
list($sPart1, $sPart2) = explode(' ', $sName);
if($sPart1 != $sPart2)
{
return false;
}
else
{
if($sPart1[0] != 'A')
{
return false;
}
else
{
$sPrev = $sPart1[0];
$aAllowed = range('A', 'C');
for($i = 1; $i <= strlen($sPart1); $i++)
{
if(!in_array($sPart1[$i], $aAllowed))
{
return false;
}
elseif($sPart1[$i] < $sPrev)
{
return false;
}
else
{
$sPrev = $sPart1[$i];
}
}
}
}
return true;
}
$sName = 'ABZ ABZ';
var_dump(checkName($sName)); // bool(false)
$sName = 'ABC ABC';
var_dump(checkName($sName)); // bool(true)
?>
Nog niet uitgebreid getest, dus het kan zijn dat er nog een paar namen tussendoor glippen. Maar ik denk dat dit wel al voldoet...
Hoezo, mijn regex voldoet prima aan alle eisen. Je moet ook niet testen met regexpal, die gebruikt brakke POSIX regexes. Met PCRE (preg_match) in PHP werkt het prima:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
function checkName($name) {
return preg_match('~^(A+B*(?(?<=B)C*|))\s\1$~', $name) === 1;
}
$sName = 'ABZ ABZ';
var_dump(checkName($sName)); // bool(false)
$sName = 'ABC ABC';
var_dump(checkName($sName)); // bool(true)
Edit: en als je dan perse wilt dat hij het via regexpal doet (ECMA regexes, geen posix en geen perl-compatible zooi), kun je '\b(A+(?:(?=B)B+C*|B*))\s\1\b' gebruiken.
function checkName($name) {
return preg_match('~^(A+B*(?(?<=B)C*|))\s\1$~', $name) === 1;
}
$sName = 'ABZ ABZ';
var_dump(checkName($sName)); // bool(false)
$sName = 'ABC ABC';
var_dump(checkName($sName)); // bool(true)
Edit: en als je dan perse wilt dat hij het via regexpal doet (ECMA regexes, geen posix en geen perl-compatible zooi), kun je '\b(A+(?:(?=B)B+C*|B*))\s\1\b' gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Richard van Velzen
Ziet er netjes uit Richard. Moet zeggen dat ik me nooit zó diep in de wereld van regexen begeven heb, maar er blijkt toch meer mogelijk te zijn dan ik dacht!
Jep het werkt,
bedankt iedereen
bedankt iedereen




