GNU/Linux >> Znalost Linux >  >> Linux

Definice regulárního výrazu?

Nedávno jsem se dostal do přátelského sporu s Ghoti o tom, co představuje regulární výraz v komentářích k mé odpovědi na tuto otázku. Tvrdil jsem, že následující je regulární výraz:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti nesouhlasil a tvrdil, že je to místo toho soubor glob. Stránka glob na wikipedii tvrdí, že (zdůrazňuji můj):

Globy neobsahují syntaxi hvězdy Kleene, která umožňuje více
opakování předchozí části výrazu; nejsou tedy
považovány za regulární výrazy, které mohou popisovat větší sadu
regulárních jazyků v jakékoli dané konečné abecedě.

Pro toto tvrzení však neexistuje žádná citace, což naznačuje, že jde pouze o názor konkrétního editora wikipedie.

The Single UNIX ® Specification, verze 2, uvádí, že základní regulární výraz (BRE) může být dokonce jeden znak:

Obyčejný znak je BRE, který se shoduje sám se sebou:jakýkoli znak v
podporované znakové sadě, kromě speciálních znaků BRE
uvedených v BRE Speciální znaky .

Jaká je tedy definice regulárního výrazu ve světě *nix a nezahrnuje tato definice soubor globs?

Přijatá odpověď:

Jak řekl lk-, -name možnost find bude argument považovat za globus, nikoli za regulární výraz.

Zda je řetězec interpretován jako globus nebo regex nebo pouze prostý řetězec, závisí na tom, co se k interpretaci používá. Je to otázka kontextu. Řetězec ve vašem příkladu, [Rr]eading[Tt]est[Dd]ata lze hodnotit řadou různých způsobů, ale co toje záleží na tom, jak to používáte. Použijte to jako globus, je to globus. Použijte jej jako regulární výraz, je to regulární výraz. V případě otázky, kde to vzniklo, OP popsal řetězec jako regulární výraz. Proto můžeme předpokládat, že to plánoval interpretovat jako regulární výraz.

Jeden znak může být také regulárním výrazem, absolutně. Může to být také řetězec a může to být také globus. Dalo by se to interpretovat jako byte nebo tinyint, chcete-li. Vše závisí na kontextu.

Existuje řada specifikací regulárních výrazů v různých podobách. BRE a ERE jsou dobře zdokumentovány. PCRE přidává spoustu funkcí. Mnoho interpretů regulárních výrazů implementuje například „všechny ERE a některé PCRE“. Nebo udělají ERE mínus nějaká funkce. Pokud půjdete podle formálních specifikací, mnoho nástrojů tvrdí, že podpora regulárních výrazů je nesprávná nebo neúplná. Znalost podrobností vám umožní přizpůsobit vaše řešení kolekci funkcí dostupných v rámci jakéhokoli nástroje, který vyhodnocuje váš regulární výraz.

Související:Příkaz `ls` nevypisuje nejnovější obsah adresáře?

Takže… pokud hledáte definice, které „vylučují“ globusy, díváte se na to ze špatné perspektivy. Co to je je určeno tím, jak jej používáte .


Linux
  1. Potřebujete uniknout z regulárních znaků v Sed, aby byly interpretovány jako regulární znaky?

  2. Bash + Ověřit název regulárním výrazem?

  3. Bash:Regulární výrazy v substituci?

  1. Jak používáte regulární výrazy s příkazem cp v Linuxu?

  2. Linux GUI Regular Expression File Renamer (s náhradou)

  3. Proč sed ve výchozím nastavení nepoužívá rozšířený režim regulárních výrazů?

  1. Proč `\d` nefunguje v regulárních výrazech v sed?

  2. Regulární výraz se sed

  3. Definice proměnné TEXINPUTS