]> Handbok Editor för reguljära uttryck Jesper K. Pedersen
blackie@kde.org
2001-07-03 0.1 &underFDL; 2001 Jesper K. Pedersen Den här handboken beskriver den grafiska komponenten för att redigera reguljära uttryck. KDE reguljärt uttryck
Inledning The regular expression editor is an editor for editing regular expression in a graphical style (in contrast to the ascii syntax). Traditionally regular expressions have been typed in the ascii syntax, which for example looks like ^.*kde\b. The major drawback of this style is: Det är svårt att förstå för andra än programmerare. It requires that you escapes certain symbols (to match a star for example, you need to type \*). Det kräver att du kommer ihåg regler för prioritet (Vad matchar x|y*? Ett ensamt x eller ett antal y, ELLER ett antal blandade x och y?) The regular expression editor, on the other hand, lets you draw your regular expression in an unambiguous way. The editor solves at least item two and three above. It might not make regular expressions available for the non-programmers, though only tests by users can tell that. So, are you a non programmer, which have gained the power of regular expression from this editor, then please let me know. Vad är ett reguljärt uttryck Regular expression is a way to specify conditions to be fulfilled for a situation in mind. Normally when you search in a text editor you specify the text to search for literally, using regular expression, on the other hand, you tell what a given match would look like. Examples of this includes I'm searching for the word KDE, but only at the beginning of the line, or I'm searching for the word the, but it must stand on its own, or I'm searching for files starting with the word test, followed by a number of digits, for example test12, test107 and test007 You build regular expressions from sub regular expression, just like you build large Lego toys from smaller subparts. As in the Lego world, there are a number of basic building blocks. In the following I will describe each of these basic building blocks using a number of examples. Söka efter normal text If you just want to search for a given text, then regular expression is definitely not a good choice. The reason for this is that regular expressions assign special meaning to some characters. This includes the following characters: .*|$. Thus if you want to search for the text kde. (i.e. the characters kde followed by a period), then you would need to specify this as kde\.The regular expression editor solves this problem by taking care of escape rules for you. Writing \. rather than just . is called escaping. Matching URL's När du väljer något som ser ut som en webbadress i KDE, så erbjuder sig programmet klipper att starta konqueror med den markerade webbadressen. Klipper gör det här genom att matcha markeringen med flera olika reguljära uttryck, och om ett av uttrycken matchar, så erbjuds kommandot som hör ihop med uttrycket. Det reguljära uttrycket för webbadresser säger (bland annat), att texten måste börja med strängen http://. Det här beskrivs med ett reguljärt uttryck, genom att inleda strängen http:// med en hatt (tecknet ^). Ovanstående är ett exempel på att matcha positioner med reguljära uttryck. På samma sätt kan positionen radslut matchas med tecknet $ (dvs. ett dollartecken). Att söka efter ordet <literal >den</literal >, men inte <emphasis >den</emphasis ><literal >na</literal >, <literal >an</literal ><emphasis >den</emphasis > eller <literal >stu</literal ><emphasis >den</emphasis ><literal >t</literal >. Två ytterligare typer av position kan matchas på ovanstående sätt, nämligen en position vid en ordgräns, och en position som inte är vid en ordgräns. Positionerna anges med texten \b (för ordgräns) och \B (för inte ordgräns). På så sätt kan en sökning efter ordet den göras genom att använda det reguljära uttrycket \bden\b. Det här anger att vi söker efter den utan några bokstäver på båda sidorna (dvs. med en ordgräns på båda sidorna). De fyra reguljära uttrycken för att matcha positioner, infogas av editorn för reguljära uttryck med hjälp av fyra olika positionsverktyg. Söka efter antingen <literal >hit</literal > eller <literal >dit</literal > Antag att du vill gå igenom dokumentet och antingen leta efter ordet hit eller dit. Med en normal sökmetod, skulle du kunna göra det här i två omgångar, första gången skulle du söka efter hit, och andra gången efter dit. Med reguljära uttryck skulle du söka efter båda på en gång. Du gör det här genom att söka efter hit|dit. dvs. avdelar de två orden med ett vertikalt streck.Observera att varje sida av det vertikala strecket är ett reguljärt uttryck, så den här funktionen är inte bara till för att söka efter två olika strängar, utan för att söka efter två olika reguljära uttryck. In the regular expression editor you do not write the vertical bar yourself, but instead select the alternative tool, and inserts the sub regular expressions above each other. Matcha vad som helst Reguljära uttryck jämförs ofta med jokertecken som används för matchning i skalet. Det här är möjligheten att ange flera filer med en asterisk. Du känner säkert igen matchning med jokertecken i följande exempel: rm *~ - here *~ is the shell wildcard matching every file ending in ~ cat test??.res - matchar varje fil som börjar med test, och sedan följs av två godtyckliga tecken, och till sist följs av texten .res. I skalet matchar asterisken alla tecken hur många gånger som helst. Med andra ord så matchar asterisken vad som helst. Det här skrivs som .* med syntaxen för reguljära uttryck. Punkten matchar vilket enskilt tecken som helst, dvs. bara ett tecken, och asterisken anger att det föregående reguljära uttrycket ska matchas hur många gånger som helst. Tillsammans säger detta vilket enskilt tecken som helst, hur många gånger som helst. Det här kan verka onödigt komplicerat, men när du ser hela bilden, inser du hur kraftfullt detta är. Låt oss titta på ett annat grundläggande reguljärt uttryck: a. Den ensamma bokstaven a är ett reguljärt uttryck som matchar en enda bokstav, nämligen bokstaven a. Om vi kombinerar det här med asterisken, dvs. a*, så har vi ett reguljärt uttryck som matchar hur många a:n som helst. Vi kan kombinera flera reguljära uttryck efter varandra, till exempel b(an)*. (an)* anger bara att vad som är inom parentes upprepas hur många gånger som helst. Antag att du skrev in det här reguljära uttrycket i sökfältet på en texteditor. Då skulle du (bland annat) ha hittat följande ord: ban, banan, bananan, banananananananan. Med information ovan, är det förhoppningsvis inte svårt för dig att skriva skalets jokertecken test??.res som ett reguljärt uttryck. Svaret är: test..\.res. En ensam punkt är vilket tecken som helst. För att matcha en ensam punkt, måste du skriva \.Det här kallas att undanta. Med andra ord, så matchar det reguljära uttrycket \. en punkt, medan en ensam punkt matchar vilket tecken som helst. In the regular expression editor, repeated regular expression is created using the repeat tool Replacing <literal >&</literal > with <literal >&amp;</literal > in HTML document I HTML måste specialtecknet & skrivas som &amp; - det här liknar undantag i reguljära uttryck. Antag att du har skrivit ett HTML-dokument med en vanlig editor (t.ex. Xemacs eller Kate), och du totalt glömt bort den här regeln. Vad du skulle göra när du insåg misstaget, vore att byta ut varje förekomst av & mot &amp;. This can easily be done using normal search and replace, there is, however, one glitch. Imagine that you did remember this rule - just a bit - and did it right some of the places. Replacing unconditionally would result in &amp; being replaced with &amp;amp; Vad du verkligen vill säga är att & bara ska ersättas om det inte följs av bokstäverna amp;. Du kan göra det här med reguljära uttryck genom att använda positiv sökning framåt. Det reguljära uttrycket, som bara matchar ett och-tecken om det inte följs av tecknen amp; ser ut som följer: &(?!amp;). Det här är förstås lättare att läsa genom att använda editorn för reguljära uttryck, där du skulle använda ett verktyg för sökning framåt. Att använda Editorn för reguljära uttryck Det här kapitlet talar om hur editorn för reguljära uttryck fungerar. Organisation av skärmen Den viktigaste delen av editorn är förstås redigeringsområdet, som är området där du ritar upp det reguljära uttrycket. Det här området är den stora gråa rutan i mitten. Ovanför redigeringsområdet finns två verktygsrader, där den första innehåller redigeringsåtgärder - som liknar ritverktygen i ett ritprogram. Den andra verktygsraden innehåller knappen Vad är det här, och knappar för att ångra och göra om. Under redigeringsområdet hittar du det reguljära uttrycket som för närvarande är uppbyggt, med den så kallade ASCII-syntaxen. Denna uppdateras medan du redigerar det reguljära uttrycket i den grafiska editorn. Om du hellre vill redigera ASCII-syntaxen, gör gärna det. Den grafiska editorn uppdateras i farten för att visa dina ändringar. Till sist, längst till vänster i redigeringsområdet hittar du ett antal färdigbyggda reguljära uttryck. De har två syften: (1) När du laddar ett reguljärt uttryck i editorn blir det här uttrycket snyggare, eller mer begripligt genom att ersätta vanliga reguljära uttryck. På skärmbilden ovan, kan du se hur ASCII-syntaxen ".*" har ersatts med en ruta som säger "anything" (vad som helst). (2) När du lägger till reguljära uttryck kan du hitta byggblock för dina egna reguljära uttryck bland de redan uppbyggda uttrycken. Se avsnittet om användardefinierade reguljära uttryck för att lära dig hur man sparar sina egna reguljära uttryck. Redigeringsverktyg Texten i det här avsnittet förutsätter att du har läst kapitlet om vad ett reguljärt uttryck är, eller känner till ämnet sedan tidigare. Alla redigeringsverktyg finns i verktygsraden ovanför redigeringsområdet. Vart och ett av dem beskrivs i det följande. Markeringsverktyg <inlinemediaobject > <imageobject ><imagedata format="PNG" fileref="select.png"/> </imageobject ></inlinemediaobject > Markeringsverktyget används för att markera element för att klippa och klistra, eller dra och släppa. Det här är mycket likt ett markeringsverktyg i vilket ritprogram som helst. Textverktyg <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="text.png"/> </imageobject ></inlinemediaobject > Med det här verktyget lägger du till normal text som ska matcha. Texten matchas bokstavligen, dvs. du behöver inte bry dig om att undanta särskilda tecken. I exemplet ovan, så byggs följande reguljära uttryck: abc\*\\\). Teckenverktyg <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="characters.png"/> </imageobject ></inlinemediaobject > Med det här verktyget lägger du till teckenintervall. Exempel är vad som motsvaras av ASCII-texten [0-9], [^a-zA-Z,_]. När du lägger till ett element med det här verktyget, visas en dialogruta där du anger teckenintervallen. Se beskrivningen av upprepade reguljära uttryck. Verktyg för alla tecken <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="anychar.png"/> </imageobject ></inlinemediaobject > Det här är det reguljära uttrycket "punkt" (.). Det matchar vilket tecken som helst. Upprepningsverktyg <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="repeat.png"/> </imageobject ></inlinemediaobject > Det här upprepar element. Det omfattar vad som i ASCII-syntax representeras med en asterisk (*), ett plustecken (+), ett frågetecken (?) och intervall ({3,5}). När du lägger till ett element med det här verktyget, så visas en dialogruta som frågar efter antalet gånger att upprepa. Du anger vad som ska upprepas, genom att rita det inne i rutan som det här verktyget lägger till. Upprepade element kan både byggas upp utifrån och in, och inifrån och ut. Det vill säga att du först kan rita det som ska upprepas, markera det och använda upprepningsverktyget för att upprepa det. Som ett alternativ kan du först lägga till upprepningselementet, och rita det som ska upprepas inne i det. Se beskrivningen av upprepade reguljära uttryck. Alternativverktyg <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="altn.png"/> </imageobject ></inlinemediaobject > Det här är alternativa reguljära uttryck (|). Du anger alternativ genom att rita varje alternativ ovanpå varandra inne i rutan som det här verktyget lägger till. Se beskrivningen av alternativa reguljära uttryck. Sammansättningsverktyg <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="compound.png"/> </imageobject ></inlinemediaobject > Sammansättningsverktyget representerar inte något reguljärt uttryck. Det används för att gruppera andra delar i en ruta, som lätt kan minskas för att bara visa namnet. Det här kan ses till höger på skärmbilden ovan. Line Start/End Tools <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="begline.png"/> </imageobject ></inlinemediaobject >   <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="endline.png"/> </imageobject ></inlinemediaobject > Verktygen för radbörjan och radslut matchar början på raden, och slutet på raden. Det reguljära uttrycket på skärmbilden ovan, matchar alltså hela rader med bara mellanslag. Se beskrivningen av reguljära uttryck för position. Word (Non)Boundary Tools <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="wordboundary.png"/> </imageobject ></inlinemediaobject >   <inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="nonwordboundary.png"/> </imageobject ></inlinemediaobject > Gränsverktygen matchar en ordgräns eller allt som inte är en ordgräns. Det reguljära uttrycket på skärmbilden matchar alltså alla ord som börjar med den. Ordet den självt, matchas dock inte. Se beskrivningen av reguljära uttryck för gränser. Positive/Negative Lookahead Tools <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="poslookahead.png"/> </imageobject ></inlinemediaobject >   <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="neglookahead.png"/> </imageobject ></inlinemediaobject > Verktygen för sökning framåt anger antingen ett positivt eller negativt reguljärt uttryck som ska matchas. Den här matchningen är dock inte en del av hela matchningen. Note: You are only allowed to place look ahead's at the end of the regular expressions. The Regular Expression Editor widget does not enforce this. Se beskrivningen av reguljära uttryck med sökning framåt. Användardefinierade reguljära uttryck To the left of the editing area is a list box located containing user defined regular expressions. Some regular expressions are pre installed with your KDE installation, while other you can save yourself. De här reguljära uttrycken har två funktioner (se den detaljerade beskrivningen), nämligen (1) erbjuder en mängd byggblock, och (2) gör vanliga reguljära uttryck snyggare. Du kan spara dina egna reguljära uttryck, genom att högerklicka med musknappen i redigeringsområdet, och välja Spara reguljärt uttryck. If the regular expression you save is within a compound container then the regular expression will take part in making subsequent regular expressions pretier. User defined regular expression can be deleted or renamed by pressing the right mouse button on top of the regular expression in question in the list box. Rapportera fel och föreslå funktioner Bug reports and feature requests should be submitted through the KDE Bug Tracking System. Before you report a bug or suggest a feature, please check that it hasn't already been reported/suggested Vanliga frågor Stöder editorn för reguljära uttryck bakåtreferenser? Nej, för närvarande stöds inte detta. Det är planerat till nästa version. Visar editorn för reguljära uttryck matchningar? Nej. Förhoppningsvis blir det här tillgängligt i nästa version. Jag är upphovsman till ett KDE-program. Hur kan jag använda den här grafiska komponenten i mitt program? Se Dokumentationen för klassen KRegExpEditorInterface. Jag kan inte hitta knappen <emphasis >Redigera reguljärt uttryck</emphasis > i till exempel Konqueror på en annan KDE3 installation, varför? Den grafiska komponenten för reguljära uttryck finns i paketet KDE-utils. Om du inte har installerat det här paketet, så visas inte knapparna för att redigera reguljära uttryck i program. Tack till och licenser Dokumentation är copyright 2001, Jesper K. Pedersen blackie@kde.org &underGPL; &underFDL;