# Re: [R] Logic with regexps

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Sat, 12 Jun 2010 10:10:13 -0400

On Sat, Jun 12, 2010 at 5:38 AM, Ted Harding <Ted.Harding_at_manchester.ac.uk> wrote:
> Greetings,
> The following question has come up in an off-list discussion.
> Is it possible to construct a regular expression 'rex' out of
> two given regular expressions 'rex1' and 'rex2', such that a
> character string X matches 'rex' if and only if X matches 'rex1'
> AND X does not match 'rex2'?
>
> The desired end result can be achieved by logically combining
> the results of a grep using 'rex1' with the results of a grep
> on 'rex2', illustrated by the following example:
>
> ## Given character vector X (below), and two regular exdpressions
> ## rex1="abc", rex2="ijk", to return the elements of X which match
> ## rex1 AND do not match rex1:
> X <- c(
>  "abcdefg",       # Yes
>  "abchijk",       # No
>  "mnopqrs",       # No
>  "ijkpqrs",       # No
>  "abcpqrs" )      # Yes
> rex1 <- "abc"
> rex2 <- "ijk"
> ix1<- grep(rex1,X)
> ix2<- grep(rex2,X)
> X[ix1[!(ix1 %in% ix2)]]
> ## [1] "abcdefg" "abcpqrs"
>
> Question: is there a way to construct 'rex' from 'rex1' and 'rex2'
> such that
>
>  X[grep(rex,X)]
>
> would given the same result?

Try this:

rex <- "^(?!(.*ijk)).*abc"
grep(rex, X, perl = TRUE)

Also note that X[grep(rex, X, perl = TRUE)] can be written:

grep(rex, X, perl = TRUE, value = TRUE)

R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Sat 12 Jun 2010 - 14:13:27 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 12 Jun 2010 - 16:40:29 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.