Regular expressions "regexps" "grep"
Reguljära uttryck Relativt vanligt att vi vill manipulera eller söka i text Text är inte alltid strukturerad, exempel emailadresser i ett email Definition av mönster som matchar den text vi är intresserad av
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi augue, fermentum ut mi non, aliquam posuere lectus. Aliquam erat volutpat. Donec ac magna nec erat consequat tristique sagittis eget ligula. Cras sit amet nibh mauris. Integer laoreet ut mauris quis posuere. Nullam vel knatte@ankeborg.se velit lectus. Phasellus erat nibh, pellentesque ac nulla et, ultrices posuere mi. Integer blandit lectus id risus malesuada, a adipiscing quam dignissim. Mauris risus tellus, scelerisque sit amet magna vel, hendrerit facilisis quam. Donec venenatis adipiscing mauris, sit amet ullamcorper tellus consectetur id. Suspendisse malesuada elit iaculis egestas ullamcorper. Pellentesque kalle@ankeborg.se vel dolor ut nibh molestie bibendum quis non felis. Cras condimentum nisl et accumsan ornare. Cras magna nisi, faucibus a ipsum eu, semper dignissim orci. Nam molestie tellus vel ullamcorper gravida. Proin urna magna, porta id venenatis id, rhoncus eget ligula. Vestibulum ac scelerisque felis. Duis vel imperdiet urna, sit amet tincidunt sapien. Fusce sit amet libero sed sapien ultricies mollis ut fnatte@ankeborg.se quis nisi. Nunc rhoncus justo eu sodales venenatis. Mauris ultricies neque id suscipit dictum. Nullam feugiat libero lorem, id egestas nisi placerat fringilla. Integer sit amet leo nunc. Nunc suscipit enim nec felis gravida luctus. Sed tempor leo ac purus egestas suscipit. Maecenas tellus neque, imperdiet fringilla bibendum nec, cursus non mauris. Integer in nulla id dui molestie venenatis. Morbi erat orci, suscipit ac libero vitae, pretium lobortis lectus. Duis varius, nulla eu ullamcorper scelerisque, turpis joakim@jva.se turpis volutpat turpis, id dapibus nulla risus sed eros. Pellentesque blandit dui sit amet venenatis volutpat. Etiam semper nunc nisi, sit amet auctor turpis semper et. Nullam aliquam massa tempor sem vehicula, quis rhoncus odio blandit. Sed pellentesque purus ultrices augue lacinia, eget imperdiet dolor varius. Nunc non ligula ac urna pulvinar tempor sit amet quis ligula. Nunc non luctus felis, ac posuere neque. Aenean tjatte@ankeborg.se ullamcorper arcu eros, ac mollis neque luctus vel. Quisque ac odio dolor. Aliquam a neque at magna pellentesque elementum. Etiam vitae ipsum elementum, feugiat eros sed, dictum orci. Mauris ante nisi, venenatis sit amet mi vitae, sagittis iaculis urna. Duis fermentum nibh ac purus tincidunt consectetur.
alla tecken 'a' till 'z' tecknet '@' alla tecken 'A' till 'Z' tecknet '.' [a-za-z.]+@[a-za-z.]+ En mängd med tecken, i detta fall alla stora och små bokstäver 'a' till 'z' plus tecknet '.' Anger hur många gånger innehållet i mängden kan upprepas, '+' betyder "en eller flera gånger" Hela uttrycket: ett eller flera tecken som antingen är de små bokstäverna a till z, de stora bokstäverna A till Z eller en punkt, följt av ett snabel-a, följt av ett eller flera tecken som antingen är de små bokstäverna a till z, de stora bokstäverna A till Z eller en punkt
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi augue, fermentum ut mi non, aliquam posuere lectus. Aliquam erat volutpat. Donec ac magna nec erat consequat tristique sagittis eget ligula. Cras sit amet nibh mauris. Integer laoreet ut mauris quis posuere. Nullam vel knatte@ankeborg.se velit lectus. Phasellus erat nibh, pellentesque ac nulla et, ultrices posuere mi. Integer blandit lectus id risus malesuada, a adipiscing quam dignissim. Mauris risus tellus, scelerisque sit amet magna vel, hendrerit facilisis quam. Donec venenatis adipiscing mauris, sit amet ullamcorper tellus consectetur id. Suspendisse malesuada elit iaculis egestas ullamcorper. Pellentesque kalle@ankeborg.se vel dolor ut nibh molestie bibendum quis non felis. Cras condimentum nisl et accumsan ornare. Cras magna nisi, faucibus a ipsum eu, semper dignissim orci. Nam molestie tellus vel ullamcorper gravida. Proin urna magna, porta id venenatis id, rhoncus eget ligula. Vestibulum ac scelerisque felis. Duis vel imperdiet urna, sit amet tincidunt sapien. Fusce sit amet libero sed sapien ultricies mollis ut fnatte@ankeborg.se quis nisi. Nunc rhoncus justo eu sodales venenatis. Mauris ultricies neque id suscipit dictum. Nullam feugiat libero lorem, id egestas nisi placerat fringilla. Integer sit amet leo nunc. Nunc suscipit enim nec felis gravida luctus. Sed tempor leo ac purus egestas suscipit. Maecenas tellus neque, imperdiet fringilla bibendum nec, cursus non mauris. Integer in nulla id dui molestie venenatis. Morbi erat orci, suscipit ac libero vitae, pretium lobortis lectus. Duis varius, nulla eu ullamcorper scelerisque, turpis joakim@jva.se turpis volutpat turpis, id dapibus nulla risus sed eros. Pellentesque blandit dui sit amet venenatis volutpat. Etiam semper nunc nisi, sit amet auctor turpis semper et. Nullam aliquam massa tempor sem vehicula, quis rhoncus odio blandit. Sed pellentesque purus ultrices augue lacinia, eget imperdiet dolor varius. Nunc non ligula ac urna pulvinar tempor sit amet quis ligula. Nunc non luctus felis, ac posuere neque. Aenean tjatte@ankeborg.se ullamcorper arcu eros, ac mollis neque luctus vel. Quisque ac odio dolor. Aliquam a neque at magna pellentesque elementum. Etiam vitae ipsum elementum, feugiat eros sed, dictum orci. Mauris ante nisi, venenatis sit amet mi vitae, sagittis iaculis urna. Duis fermentum nibh ac purus tincidunt consectetur.
början på en rad här, dvs inte i en mängd, betyder punkten vilket tecken som helst Ska finnas minst en gång ^(.+)$ slutet på en rad Kom ihåg vad mönstret hittade "Hitta alla rader som består av minst 1 tecken" För att komma åt vad som hittades här så används "$1" eller "\1" beroende på vilket system som används
Sök efter : ^(.+)$ Ersätt med : <p>\1</p>
<p>lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi augue, fermentum ut mi non, aliquam posuere lectus. Aliquam erat volutpat. Donec ac magna nec erat consequat tristique sagittis eget ligula. Cras sit amet nibh mauris. Integer laoreet ut mauris quis posuere. Nullam vel knatte@ankeborg.se velit lectus. Phasellus erat nibh, pellentesque ac nulla et, ultrices posuere mi. Integer blandit lectus id risus malesuada, a adipiscing quam dignissim. Mauris risus tellus, scelerisque sit amet magna vel, hendrerit facilisis quam. Donec venenatis adipiscing mauris, sit amet ullamcorper tellus consectetur id. Suspendisse malesuada elit iaculis egestas ullamcorper. Pellentesque kalle@ankeborg.se vel dolor ut nibh molestie bibendum quis non felis. Cras condimentum nisl et accumsan ornare. Cras magna nisi, faucibus a ipsum eu, semper dignissim orci. Nam molestie tellus vel ullamcorper gravida.</p> <p>proin urna magna, porta id venenatis id, rhoncus eget ligula. Vestibulum ac scelerisque felis. Duis vel imperdiet urna, sit amet tincidunt sapien. Fusce sit amet libero sed sapien ultricies mollis ut fnatte@ankeborg.se quis nisi. Nunc rhoncus justo eu sodales venenatis. Mauris ultricies neque id suscipit dictum. Nullam feugiat libero lorem, id egestas nisi placerat fringilla. Integer sit amet leo nunc. Nunc suscipit enim nec felis gravida luctus. Sed tempor leo ac purus egestas suscipit. Maecenas tellus neque, imperdiet fringilla bibendum nec, cursus non mauris. Integer in nulla id dui molestie venenatis.</p> <p>morbi erat orci, suscipit ac libero vitae, pretium lobortis lectus. Duis varius, nulla eu ullamcorper scelerisque, turpis joakim@jva.se turpis volutpat turpis, id dapibus nulla risus sed eros. Pellentesque blandit dui sit amet venenatis volutpat. Etiam semper nunc nisi, sit amet auctor turpis semper et. Nullam aliquam massa tempor sem vehicula, quis rhoncus odio blandit. Sed pellentesque purus ultrices augue lacinia, eget imperdiet dolor varius. Nunc non ligula ac urna pulvinar tempor sit amet quis ligula. Nunc non luctus felis, ac posuere neque. Aenean tjatte@ankeborg.se ullamcorper arcu eros, ac mollis neque luctus vel. Quisque ac odio dolor. Aliquam a neque at magna pellentesque elementum. Etiam vitae ipsum elementum, feugiat eros sed, dictum orci. Mauris ante nisi, venenatis sit amet mi vitae, sagittis iaculis urna. Duis fermentum nibh ac purus tincidunt consectetur.</p>
Sök efter : ([a-za-z.]+)@([a-za-z.]+) Ersätt med : <a href="mailto:\1@\2">\1</a>
<p>lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi augue, fermentum ut mi non, aliquam posuere lectus. Aliquam erat volutpat. Donec ac magna nec erat consequat tristique sagittis eget ligula. Cras sit amet nibh mauris. Integer laoreet ut mauris quis posuere. Nullam vel <a href="mailto:knatte@ankeborg.se">knatte</a> velit lectus. Phasellus erat nibh, pellentesque ac nulla et, ultrices posuere mi. Integer blandit lectus id risus malesuada, a adipiscing quam dignissim. Mauris risus tellus, scelerisque sit amet magna vel, hendrerit facilisis quam. Donec venenatis adipiscing mauris, sit amet ullamcorper tellus consectetur id. Suspendisse malesuada elit iaculis egestas ullamcorper. Pellentesque <a href="mailto:kalle@ankeborg.se">kalle</a> vel dolor ut nibh molestie bibendum quis non felis. Cras condimentum nisl et accumsan ornare. Cras magna nisi, faucibus a ipsum eu, semper dignissim orci. Nam molestie tellus vel ullamcorper gravida.</p> <p>proin urna magna, porta id venenatis id, rhoncus eget ligula. Vestibulum ac scelerisque felis. Duis vel imperdiet urna, sit amet tincidunt sapien. Fusce sit amet libero sed sapien ultricies mollis ut <a href="mailto:fnatte@ankeborg.se">fnatte</a> quis nisi. Nunc rhoncus justo eu sodales venenatis. Mauris ultricies neque id suscipit dictum. Nullam feugiat libero lorem, id egestas nisi placerat fringilla. Integer sit amet leo nunc. Nunc suscipit enim nec felis gravida luctus. Sed tempor leo ac purus egestas suscipit. Maecenas tellus neque, imperdiet fringilla bibendum nec, cursus non mauris. Integer in nulla id dui molestie venenatis.</p> <p>morbi erat orci, suscipit ac libero vitae, pretium lobortis lectus. Duis varius, nulla eu ullamcorper scelerisque, turpis <a href="mailto:joakim@jva.se">joakim</a> turpis volutpat turpis, id dapibus nulla risus sed eros. Pellentesque blandit dui sit amet venenatis volutpat. Etiam semper nunc nisi, sit amet auctor turpis semper et. Nullam aliquam massa tempor sem vehicula, quis rhoncus odio blandit. Sed pellentesque purus ultrices augue lacinia, eget imperdiet dolor varius. Nunc non ligula ac urna pulvinar tempor sit amet quis ligula. Nunc non luctus felis, ac posuere neque. Aenean <a href="mailto:tjatte@ankeborg.se">tjatte</a> ullamcorper arcu eros, ac mollis neque luctus vel. Quisque ac odio dolor. Aliquam a neque at magna pellentesque elementum. Etiam vitae ipsum elementum, feugiat eros sed, dictum orci. Mauris ante nisi, venenatis sit amet mi vitae, sagittis iaculis urna. Duis fermentum nibh ac purus tincidunt consectetur.</p>
Reguljära uttryck Viktigt Användbart på många ställen: texteditorer, ordbehandlare, IDE, programspråk, etc Många resurser http://regex.info http://www.regular-expressions.info http://regexlib.com http://regexlib.com/cheatsheet.aspx
Java Pattern och Matcher Ett Pattern-objekt innehåller ett kompilerat reguljärt uttryck Matcher används för att göra själva sökningen String-klassen innehåller också några funktioner för att jobba med reguljära uttryck
String-klassen matches - kollar om strängen uppfyller ett regexp eller inte replaceall - ersätter alla förekomster av ett reguljärt uttryck replacefirst - ersätter första förekomsten av ett reguljärt uttryck split - använd ett reguljärt uttryck för att tala om vart en sträng ska delas upp
import java.util.regex.*; public class RegExpDemo1 { private static final String SearchPattern = "([a-za-z.]+)@([a-za-z.]+)"; private static final String SourceString = "ut mi non, knatte@ankeborg.se aliquam posuere lectus."; public static void main( String args[] ) { Pattern p = Pattern.compile( SearchPattern ); Matcher m = p.matcher( SourceString ); } } System.out.println( m.replaceall( "<a href=\"mailto:$1@$2\">$1</a>" )); ut mi non, <a href="mailto:knatte@ankeborg.se">knatte</a> aliquam posuere lectus.
import java.util.regex.*; public class RegExpDemo2 { private static final String SearchPattern = "([a-za-z.]+)@([a-za-z.]+)"; private static final String SourceString = "Lorem ipsum dolor sit amet,..."; public static void main( String args[] ) { Pattern p = Pattern.compile( SearchPattern ); Matcher m = p.matcher( SourceString ); } } while( m.find() ){ System.out.println( m.group() + " start " + m.start() + " end " + m.end() ); } knatte@ankeborg.se start 285 end 303 kalle@ankeborg.se start 685 end 702 fnatte@ankeborg.se start 1104 end 1122 joakim@jva.se start 1640 end 1653 tjatte@ankeborg.se start 2078 end 2096
Ett annat exempel Visar på hur man kan kombinera olika metatecken och positioner Det finns antagligen bättre sätt att skriva detta på men vill visa på metatecken Uppgiften är att hitta alla ord som börjar på w
import java.io.*; import java.util.regex.*; public class Demo03 { private final static String EXAMPLE = "example.txt"; private final static String PATTERN = "reguljära uttrycket här"; private static String gettext( ) { char inp[] = new char[1000]; try{ Reader input = new BufferedReader( new FileReader( EXAMPLE ) ); input.read( inp ); } catch ( java.io.filenotfoundexception fnf ) { fnf.printstacktrace(); } catch ( java.io.ioexception io ){ io.printstacktrace(); } return new String(inp); } public static void main( String[] argv ) { Pattern p = Pattern.compile( PATTERN ); Matcher m = p.matcher( gettext() ); } } while( m.find() ){ System.out.println( m.group( ) ); }
Demotext This is a short demo string that can be used by those who wants to play with some regular expressions. Regular expressions, or as they sometimes are called, "regexps" are useful. What can you say: wiff,wiff perhaps or between words
Försök nr 1 "w.*" Bokstaven w 0 eller fler gånger Vilket tecken som helst > java Demo03 who wants to play with some regular expressions. Regular wiff,wiff perhaps or between words
Försök nr 2 "w[^ ]*" 0 eller fler gånger Bokstaven w icke Tecknet En mängd av tecken who wants with wiff,wiff ween words
Försök nr 3 " w[^ ]*" 0 eller fler gånger Bokstaven w icke Tecknet En mängd av tecken who wants with wiff,wiff
Försök nr 4 " w\\w*" " w\w*" 0 eller fler gånger Tecknet Bokstaven w Metatecknet ordtecken who wants with wiff
Försök nr 5 Betyder ordgräns "\bw\w*\b" "\\bw\\w*\\b" 0 eller fler Bokstaven w who wants gånger Metatecknet ordtecken with wiff wiff words
\A Början av en sträng \b Ordgräns \B Inte en ordgräns \d Siffra \D Inte en siffra \s whitespace \S Inte whitespace \t Tab \w ordtecken \W Inte ordtecken \z Slut på sträng \Z Slut på sträng eller före nyrad
* 0 eller flera gånger + 1 eller flera gånger? 0 eller 1 {count} {min,} {min,max} Exact count gånger Minst min gånger min x max *? 0 eller fler (minimalt) +? 1 eller fler (minimalt)?? 0 eller 1 (minimalt) {min,}? Minst min gånger (minimalt) {min,max}? min x max (minimalt)
Ta bort mellanslag i början på raden public static void main( String[] argv ) { Pattern p = Pattern.compile( PATTERN ); Matcher m = p.matcher( gettext() ); } System.out.println( m.replaceall( "" ) );
Försök 1 "^\\s*" 0 eller fler Början på raden gånger Metatecknet white space > java Demo04 This is a short demo string that can be used by those who wants to play with some regular expressions. Regular expressions, or as they sometimes are called, "regexps" are useful. What can you say: wiff,wiff perhaps or between words
Försök 2 public static void main( String[] argv ) { Pattern p = Pattern.compile( PATTERN, Pattern.MULTILINE ); Matcher m = p.matcher( gettext() ); } System.out.println( m.replaceall( "" ) ); "^\\s*" > java Demo05 This is a short demo string that can be used by those who wants to play with some regular expressions. Regular expressions, or as they sometimes are called, "regexps" are useful. What can you say: wiff,wiff perhaps or between words
Ta bort radbrytningar och bara ett mellanslag "\\n \\s+" > java Demo06 This is a short demo string that can be used by those who wants to play with some regular expressions. Regular expressions, or as they sometimes are called, "regexps" are useful. What can you say: wiff,wiff perhaps or between words
"\\n\\s* \\s+" > java Demo06 This is a short demo string that can be used by those who wants to play with some regular expressions. Regular expressions, or as they sometimes are called, "regexps" are useful. What can you say: wiff,wiff perhaps or between words
Saknar Har inte lyckats hitta möjligheten att definiera funktionsanrop i uttryck i java.util.regexp Jag kanske är blind men