A Ruby example of String#[]
str = "Oh, this is a pen."
p str[/this is a (\w+)\./, 1]
The result is "pen". Since String#[]
is just an alias of String#slice
, (*1)
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\+\)\.')[1]
(Added at Sun Jun 12 09:26:44 PDT 2011) thinca suggested that matchstr()
with \zs
and \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\.')
in Haskell
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 \zs
and \ze
.
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"
in Clojure
(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.
No comments:
Post a Comment