Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: String function headache.

From   Nick Cox <>
Subject   Re: st: String function headache.
Date   Mon, 25 Apr 2011 09:28:21 +0100

If you want to check for occurrence, just use -strpos()- instead. I
often see people on this list struggling with the regex functions or
-strmatch()- when a simpler function will do the job. I have offered a
talk on functions for the London users' meeting and this point is
already one of the slides.

foreach y in # {
forvalues x=1/6 {
          replace mynumber `x'= strpos(mystring`x', "`y'") > 0

Otherwise, my understanding is this: a pattern that is just a literal
character will be matched only by strings that are exactly that
character; for almost all matching problems, you must specify * and/or
?. You seem to be expecting -strmatch()- to behave more like
-regexm()-, but they have different jobs.

But as said -strpos()- is easier to figure out.


On Mon, Apr 25, 2011 at 4:45 AM, Scott Talkington <> wrote:
> I just can't seem to make this work.  What I want to do is search for any
> occurrence of the "#" character in a string variable and set a flag for that
> observation.  I'm searching 6 different strings labeled something like
> mystring1 mystring2 etc. and the flags are mynumber1 mynumber2 etc..
> So my do file:
> forvalues x=1/6 {
> foreach y in # {
> replace mynumber `x'= strmatch(mistring`x', "`y'")
> }
> }
> I just listed one character in the y list above, but in reality I'm not
> having a problem with normal strings like "APT" but with wildcards and with
> the number sign character itself.
> I assumed that placing a "?" character iyn the search string (s2) would
> match zero or one characters + the "#" but it seems to be matching all
> strings with one character that are either a  number  or a letter.  Huh?
> If I include the wildcard (either the asterisk or the question mark)
> *anywhere* (either in the "foreach" part of the do file or in the "replace"
> command) it just doesn't work the way I expect it to.  There's a difference
> between what I get depending on how many quotes I use  and where as well,
> but I'm just not getting anything that does what I want it to.  I've even
> tried using the backslash character to indicate that I don't want the "#" to
> be read as an operator, but I'm not even sure where to put the backslash or
> how to arrange the quotation marks.  It's driving me nuts.  There's some
> rule here that I'm just not getting.

*   For searches and help try:

© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index