2.9 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	Regular expressions
In lyng, you create regular expressions using class Regex or String.re methods:
assert( "\d*".re is Regex )
assert( Regex("\d*") is Regex )
>>> void
We plan to add slash syntax at some point.
To check that some string matches as whole to some regex:
assert( "123".matches("\d{3}".re) )
assert( !"123".matches("\d{4}".re) )
assert( !"1234".matches("\d".re) )
>>> void
To check that part of the string matches some regular expession, use match operator =~ just like in Ruby, and its
counterpart, not match operator !~:
assert( "abc123def" =~ "\d\d\d".re )
assert( "abc" !~ "\d\d\d".re )
>>> void
When you need to find groups, and more detailed match information, use Regex.find:
val result = Regex("abc(\d)(\d)(\d)").find( "bad456 good abc123")
assert( result  != null )
assertEquals( 12 .. 17, result.range )
assertEquals( "abc123", result[0] )
assertEquals( "1", result[1] )
assertEquals( "2", result[2] )
assertEquals( "3", result[3] )
>>> void
Note that the object RegexMatch, returned by [Regex.find], behaves much like in many other languages: it provides the
index range and groups matches as indexes.
Match operator actually also provides RegexMatch in $~ reserved variable (borrowed from Ruby too):
assert( "bad456 good abc123" =~ "abc(\d)(\d)(\d)".re )
assertEquals( 12 .. 17, $~.range )
assertEquals( "abc123", $~[0] )
assertEquals( "1", $~[1] )
assertEquals( "2", $~[2] )
assertEquals( "3", $~[3] )
>>> void
This is often more readable than calling find.
Note that =~ and !~ operators against strings and regular expressions are commutative, e.g. regular expression and a
string can be either left or right operator, but not both:
assert( "abc" =~ "\wc".re )
assert( "abc" !~ "\w1c".re )
assert( "a\wc".re =~ "abcd" )
assert( "a[a-z]c".re !~ "a2cd" )
>>> void
Also, string indexing is Regex-aware, and works like Regex.find (not findall!):
assert( "cd" == "abcdef"[ "c.".re ].value )
>>> void
Regex class reference
| name | description | notes | 
|---|---|---|
| matches(str) | true if the whole str matches | 
|
| find(str) | find first match in str or null | 
(1) | 
| findAll(str) | find all matches in str as List | 
(1) | 
(1)
:: See RegexMatch class description below
RegexMatch
| name | description | notes | 
|---|---|---|
| range | the Range of the match in source string | |
| value | the value that matches | |
| [n] | List of group matches | (1) | 
(1) :: the [0] element is always value, [1] is group 1 match of any, etc.