Proč je poslední výraz v mém regulární výraz zřetězení k prvnímu?

hlasů
0

Jazyk je Ruby, tady je moje IRB sezení

expr = /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/
=> /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/

/> str = select from Entity order by value desc
=> select from Entity order by value desc

/> expr =~ str
=> 0

/> $1
=> Entity order by value desc

/> $2
=> nil

Já jen nechápu, proč jsem stále „Entity pořadí podle hodnoty sestupně“ $ 1. Žádané chování zde bude získat $ 1 => subjektu, $ 2 => value, $ 3 => desc. Co dělám špatně? Jak mohu změnit tento regulární výraz, takže jsem si tyto výsledky?

Děkuji

Položena 27/08/2009 v 02:07
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
4

\ D je „non číslice“, která pokrývá mezery mezi slovy, jakož i následující slova. Zkuste (\ S +) namísto.

[Edit] Sorry, jsem vynechal otázku na konci. Výše uvedené odpovědi ‚proč se to stalo?‘, Ale ne ‚jak mohu dosáhnout toho, co jsem chtěl?‘. Tady je jeden způsob, obcházet jiné klauzule s. *

/\Aselect from (\S+).*(?:order by (\S+) (asc|desc)?)?\Z/

Vzhledem k tomu, SQL je docela zdarma s odstupem a jako mezi klíčová slova, měli byste chtěli, aby bylo více nečitelné a používat \ s + namísto doslovné prostorů. To znamená, že výraz tak, jak je se neshodují:

"select   from     Fred"

ale to by se pokud jste / \ AVyberte \ s + z \ s + ....

Odpovězeno 27/08/2009 v 02:12
zdroj uživatelem

hlasů
1

(\D+)Je chamtivý a snědl zbytek řetězce. Vzhledem k tomu, vše, co ve svém projevu je volitelný (* nebo?), Není třeba tak, aby odpovídala na expresi uspět.

Můj návrh je, aby se vaše zápasy méně chamtivý. např (\D+?)budou odpovídat a zachytit jednou nebo vícekrát, ale párkrát nějakého non-místné podle potřeby, aby se úspěšný zápas.

Odpovězeno 27/08/2009 v 07:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more