A Ruby example of
str = "Oh, this is a pen." p str[/this is a (\w+)\./, 1]
The result is "pen". Since
String# is just an alias of
p str.slice(/this is a (\w+)\./, 1)
The result is completely same.
in Vim script
Vim script version needs two separate processes; getting the list of first-matched string itself and containing sub matches, and then getting the specific item.
let str = "Oh, this is a pen." echo matchlist(str, 'this is a \(\w\+\)\.')
(Added at Sun Jun 12 09:26:44 PDT 2011) thinca suggested that
\ze is very handy, particularly because of the different behavior in the case when it didn't match.
let str = "Oh, this is a pen." echo matchstr(str, 'this is a \zs\w\+\ze\.')
Haskell version needs three separate processes with
Text.Regex.Posix.=~; it's almost same to Vim but the default
=~ behaviour is to assume the regex object has "global" option, so you have to pick which match.
import Text.Regex.Posix ((=~)) main = do let str = "Oh this is a pen." print $ head (str =~ "this is a ([a-zA-Z_]*)" :: [[String]]) !! 1
(Added at Sun Jun 12 12:54:01 PDT 2011) The following code is another example; it's safe in runtime and also this supports Vim's
import Text.Regex.PCRE ((=~)) import Data.String.Utils (replace) import Safe (headMay, atMay) import Data.Maybe (fromMaybe) matchstr :: String -> String -> String matchstr expr pat = let x = replace "\\zs" "(" $ replace "\\ze" ")" pat in fromMaybe "" $ headMay (expr =~ x :: [[String]]) >>= \y -> atMay y 1 main = print $ matchstr "this is a pen" " \\zs\\w+\\ze"
(Added at Thu Mar 22 17:49:40 PDT 2012)
((re-find #"this is a (\w+)\." "Oh, this is a pen.") 1) ; "pen"
- (*1) Precisely no. Try and check the differences between them without the second argument.