ugrás a tartalomhoz

Függőleges vonallal elválasztott szavakat felismerő reguláris kifejezés

w3net · 2006. Dec. 20. (Sze), 15.46
Kérek minden reguláris kifejezés gurut, hogy vizsgálja meg a következő kódot, és magyarázza el nekem, hogy miért ad vissza false-t.
Szerény véleményem szerint ennek true-t kellen visszaadnia.
A reWork oldalon is teszteltem, és a JavaScript motorja true-t adott vissza.
<?php
$expr = 'FreeBSD';
if (preg_match('/^([^\\\r\n\|]+\|{0,1}[^\\\r\n\|]{0,})*$/i',$expr)){
	die("MATCH");
}
?>
 
1

mi volt a cél?

Táskai Zsolt · 2006. Dec. 20. (Sze), 16.28
szerintem is true-nak kéne jönni, de mi volt a cél (a true mellett:))?

ez most szerintem a következőt csinálja: néhány nem-enter-nem-|-nem-\ karakter, majd esetleg egy |, majd néhány nem-enter-nem-|-nem-\ karakter vagy egy sem, illetve ilyenek sorozata.

ez néhány (legalább egy) szó, ha több van, akkor |-val elválasztva? ennek kicsit bonyolult a kifejezés, de én csak ezt tudom beleérteni...

megj: a {0,1} röviden ?, a {0,} röviden *
megj2: a rejtvény megoldását nem tudom:)
2

A cél

w3net · 2006. Dec. 20. (Sze), 16.45
Olyan karakterláncnak kellene illeszekni a kifejezéshez, amely
1. nem tartalmaz:
\n
\r
\
karaktereket
2. az első követelménynek megfelelő sztring szerepelhet egyedül is, vagy | karakterrel elválasztva több is.

Tehát ezek a karakterláncok helyesek:
autó|kocsi|jancsi
vagy
bela
vagy
aaa222|sksks
vagy
a

Viszont ez már nem helyes:
auto||auto

Esetleg ezekkel a szabályokkal valaki megpróbálhatna összedobni egy PHP-ben is működő reg. kifejezést (PCRE). Köszi.
3

The Regex Coach

sotetbarna · 2006. Dec. 20. (Sze), 17.35
szerintem ezzel a progival nagyon sokat lehet tanulni: The Regex Coach
8

Ez se rossz

w3net · 2006. Dec. 20. (Sze), 18.22
Ezzel a progival is sokat lehet tanulni :)
The Regulator
4

egy megoldás

Táskai Zsolt · 2006. Dec. 20. (Sze), 17.45
hirtelen ezt dobtam össze:
^([^\r\n\|\\]+\|)*[^\r\n\|\\]*$
itt ellenőriztem PCRE módban: http://www.rexv.org/

(hátránya lehet, hogy elfogadja ezt: "asdf|asdf|")
7

PHP alatt nem megy

w3net · 2006. Dec. 20. (Sze), 18.15
Warning: preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 29
9

nyilván nem

Táskai Zsolt · 2006. Dec. 20. (Sze), 18.28
mivel PHP-be így kell beilleszteni:
<?php
$expr = 'FreeBSD|asdf';
if (preg_match('/^([^\\r\\n\\|\\\\]+\|)*[^\\r\\n\\|\\\\]*$/i',$expr)){
    die("MATCH");
}
?>
10

működik, de most már az enyém is

w3net · 2006. Dec. 20. (Sze), 18.54
én úgy tudtam, hogy az aposztrófban nem kell escapeolni.

idézet
If a backslash needs to occur before a single quote or at the end of the string, you need to double it. Note that if you try to escape any other character, the backslash will also be printed! So usually there is no need to escape the backslash itself.

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';


Kösz mindenkinek a segitséget, mindig tanul valamit az ember.
5

Én erre gondolok

vbence · 2006. Dec. 20. (Sze), 17.54
^([^\r\n\|\\]+\|)*[^\r\n\|\\]+$
6

egy rugóra jár az agyunk

Táskai Zsolt · 2006. Dec. 20. (Sze), 18.09
:)
12

hogy mik vannak...

vbence · 2006. Dec. 22. (P), 02.39
Csak a végén néztem össze a kettőt... és mivel egy karakterben külöböznek, gondoltam maradhat :)
11

Bonyolult

janoszen · 2006. Dec. 21. (Cs), 00.38
Te jó ég! Minek regexp? Explode-old szét és nézd meg, hogy van-e üres elem...