string.seach() RegEx question

Discussion in 'Javascript' started by Lord Khaos, Dec 16, 2003.

  1. Lord Khaos

    Lord Khaos Guest

    If I am trying to find an expression, foo, I can do something like
    this:

    rExp = /foo/gi;
    if(results.search(rExp) > -1){

    and all work fine.

    however, if I want my search term to be a variable, bar:
    var bar= "foo";
    i get error when I try to concatinate bar into the regex.

    I'm not very good with Regular expressions, or JavaScript for that
    matter, but apparently rExp is not a string or it would be in quotes,
    and it isn't an integer or boolean. So what is it's data type? and how
    would I merge the variable bar into it so that it is /bar/gi?

    Thanks,
    L^K
     
    Lord Khaos, Dec 16, 2003
    #1
    1. Advertising

  2. Lord Khaos

    Evertjan. Guest

    Lord Khaos wrote on 16 dec 2003 in comp.lang.javascript:

    > If I am trying to find an expression, foo, I can do something like
    > this:
    >
    > rExp = /foo/gi;
    > if(results.search(rExp) > -1){
    >
    > and all work fine.
    >
    > however, if I want my search term to be a variable, bar:
    > var bar= "foo";
    > i get error when I try to concatinate bar into the regex.
    >
    > I'm not very good with Regular expressions, or JavaScript for that
    > matter, but apparently rExp is not a string or it would be in quotes,
    > and it isn't an integer or boolean. So what is it's data type? and how
    > would I merge the variable bar into it so that it is /bar/gi?



    <script>
    function TestDemo(teststr, s){
    re = new RegExp(teststr,"gi");
    return re.test(s);
    };

    bar = "foo";
    alert( TestDemo(bar, "foobar") );
    </script>


    --
    Evertjan.
    The Netherlands.
    (Please change the x'es to dots in my emailaddress)
     
    Evertjan., Dec 16, 2003
    #2
    1. Advertising

  3. Lord Khaos

    Grant Wagner Guest

    Lord Khaos wrote:

    > If I am trying to find an expression, foo, I can do something like
    > this:
    >
    > rExp = /foo/gi;
    > if(results.search(rExp) > -1){
    >
    > and all work fine.
    >
    > however, if I want my search term to be a variable, bar:
    > var bar= "foo";
    > i get error when I try to concatinate bar into the regex.
    >
    > I'm not very good with Regular expressions, or JavaScript for that
    > matter, but apparently rExp is not a string or it would be in quotes,
    > and it isn't an integer or boolean. So what is it's data type? and how
    > would I merge the variable bar into it so that it is /bar/gi?
    >
    > Thanks,
    > L^K


    var bar = "foo";
    var rExp = new RegExp(bar, "gi");
    var results = "blah blah foo blah";
    if (results.search(rExp) > -1) {
    // Please note:
    // "if (rExp.test(results)) {"
    // is faster if all you're doing is testing for a match
    // and you don't care about the resulting matches
    // it also works when results is null
    alert("yes");
    }

    Also note that if [bar] is going to contain any special regex entities
    (\d, \s, etc), you need to apply string character escaping rules to them:

    var bar = "\d"; // this regex will find a digit right?
    var rExp = new RegExp(bar);
    var result = "1";
    alert(rExp.test(result)); // hmm, it's false

    var bar = "\\d"; // no, this will find a single digit
    var rExp = new RegExp(bar);
    var result = "1";
    alert(rExp.test(result)); // now it's true like it's supposed to be

    If you're setting [bar] in a loop, you can avoid creating a new object
    each time by using the compile() method:

    var rExp = new RegExp();
    for (var i = 0; i < loop.length; i++) {
    rExp.compile(yourArray);
    if (rExp.test(result)) {
    // ...
    }

    --
    | Grant Wagner <>

    * Client-side Javascript and Netscape 4 DOM Reference available at:
    *
    http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/frames.html

    * Internet Explorer DOM Reference available at:
    *
    http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp

    * Netscape 6/7 DOM Reference available at:
    * http://www.mozilla.org/docs/dom/domref/
    * Tips for upgrading JavaScript for Netscape 7 / Mozilla
    * http://www.mozilla.org/docs/web-developer/upgrade_2.html
     
    Grant Wagner, Dec 16, 2003
    #3
  4. Lord Khaos

    Lord Khaos Guest

    Thank you both for the help, that is just what I was looking for- I
    think ??? :)

    What I'm actually doing is trying to write ASP/JavaScript where the
    user enters a search term into a form. I have the following:
    =========================
    <% @Language="JavaScript" %>
    <!-- #include file="dsnless_db.inc" -->
    <%
    var search= Request.QueryString("term");
    var my_ids = new Array();
    var i=0;
    sql="select name, description, id from products";
    RS=Connection.Execute(sql);
    rExp = new RegExp(search, "gi");
    do{
    results = RS.Fields("description").value;
    results2= RS.Fields("name").value;
    if(results.search(rExp) > -1 || results2.search(rExp) > -1){
    my_ids=RS.Fields("id").value;
    i++}
    RS.MoveNext;
    }while(!RS.EOF);

    var number = my_ids.length;
    if(number > 0){ %>
    <html><body>
    <%
    for(i=0;i<number;i++){
    sql="SELECT * FROM products WHERE id=" + my_ids;
    RS=Connection.Execute(sql);%>
    <%
    do{ %><b>Product #
    <%Response.write(RS.Fields("id"));%>
    </b><P>
    <br><% Response.write(RS.Fields("name")); %>
    <br>
    <% Response.write(RS.Fields("description"));
    %>
    <br><% Response.write(RS.Fields("price")); %>
    <hr></P>
    <% RS.MoveNext;
    }while(!RS.EOF);
    }
    }
    Connection.Close ;

    %>
    ------------------------
    This works, thank you again, but I'm wondering now if .test would be
    better than search.

    TIA,
    L^K
     
    Lord Khaos, Dec 16, 2003
    #4
  5. Lord Khaos

    Eric Bohlman Guest

    Lord Khaos <> wrote in
    news::

    > If I am trying to find an expression, foo, I can do something like
    > this:
    >
    > rExp = /foo/gi;
    > if(results.search(rExp) > -1){
    >
    > and all work fine.
    >
    > however, if I want my search term to be a variable, bar:
    > var bar= "foo";
    > i get error when I try to concatinate bar into the regex.
    >
    > I'm not very good with Regular expressions, or JavaScript for that
    > matter, but apparently rExp is not a string or it would be in quotes,
    > and it isn't an integer or boolean. So what is it's data type? and how
    > would I merge the variable bar into it so that it is /bar/gi?


    Its data type (class) is RegExp. You can create one from a string by using
    the RegExp constructor: rExp=new RegExp(bar,"gi");

    or, since you might want to match whatever is in bar only if it appears as
    a single word (i.e. match "foo" but not "football"), you can use a string
    expression as the first argument: rExp=new RegExp("\\b"+bar+"\\b","gi");

    Note that when you're building a RegExp from a string, you have to escape
    any backslashes in string literals that you want to become metacharacters,
    and you have to double-escape any backslashes that you want to become
    literal match characters. If the argument above had been "\b"+bar+"\b"
    then the string expression would evaluate to a backspace character followed
    by the contents of bar followed by another backspace character and the
    regexp would be created from that, which is not what you want.
     
    Eric Bohlman, Dec 16, 2003
    #5
  6. Lord Khaos

    Eric Bohlman Guest

    Grant Wagner <> wrote in
    news::

    > If you're setting [bar] in a loop, you can avoid creating a new object
    > each time by using the compile() method:
    >
    > var rExp = new RegExp();
    > for (var i = 0; i < loop.length; i++) {
    > rExp.compile(yourArray);
    > if (rExp.test(result)) {
    > // ...
    > }


    How widely supported is this? I don't see any mention of it in Flanagan or
    the Netscape core reference.
     
    Eric Bohlman, Dec 16, 2003
    #6
  7. Eric Bohlman <> writes:

    [rExp.compile]

    > How widely supported is this? I don't see any mention of it in Flanagan or
    > the Netscape core reference.


    Not widely, I would have thought. It's not part of ECMAScript either.

    However, a quick test shows it supported by Mozilla Firebird, Opera 5+,
    IE 6, and Netscape 4. That's very wide already.

    (and not Netscape 3 (no RegExp at all) or Opera 4 (appears to accept
    /a/ syntax, but doesn't do anything with it))

    /L
    --
    Lasse Reichstein Nielsen -
    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
    'Faith without judgement merely degrades the spirit divine.'
     
    Lasse Reichstein Nielsen, Dec 16, 2003
    #7
  8. Lord Khaos

    Grant Wagner Guest

    Lasse Reichstein Nielsen wrote:

    > Eric Bohlman <> writes:
    >
    > [rExp.compile]
    >
    > > How widely supported is this? I don't see any mention of it in Flanagan or
    > > the Netscape core reference.

    >
    > Not widely, I would have thought. It's not part of ECMAScript either.
    >
    > However, a quick test shows it supported by Mozilla Firebird, Opera 5+,
    > IE 6, and Netscape 4. That's very wide already.
    >
    > (and not Netscape 3 (no RegExp at all) or Opera 4 (appears to accept
    > /a/ syntax, but doesn't do anything with it))
    >
    > /L


    It's been available since JavaScript 1.2 in Netscape:

    <url:
    http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/regexp.html#1194687
    />
    <url:
    http://devedge.netscape.com/library/manuals/2000/javascript/1.4/reference/regexp.html#1194687
    />

    Although oddly enough, the compile() method isn't listed in JavaScript 1.5, and I
    haven't noticed until now because I typically use the 1.3 documentation to avoid
    any temptation to do anything Netscape 4.7x won't understand. What's even
    stranger is there is no mention made of the dropping of the compile() method, and
    indicates that (as does the documentation above) that the RegExp() object has
    been available since JavaScript 1.2.

    <url:
    http://msdn.microsoft.com/library/en-us/jscript7/html/jsmthcompile.asp?frame=true
    /> indicates that the compile() method has been available in JScript since
    Version 3 (Internet Explorer 4).

    I'm surprised it isn't part of ECMAScript, since it obviously provides a
    performance advantage over having to create a new RegExp() object everytime you
    want to evaluate a new pattern, as in the loop example.

    --
    | Grant Wagner <>

    * Client-side Javascript and Netscape 4 DOM Reference available at:
    *
    http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/frames.html

    * Internet Explorer DOM Reference available at:
    *
    http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp

    * Netscape 6/7 DOM Reference available at:
    * http://www.mozilla.org/docs/dom/domref/
    * Tips for upgrading JavaScript for Netscape 7 / Mozilla
    * http://www.mozilla.org/docs/web-developer/upgrade_2.html
     
    Grant Wagner, Dec 17, 2003
    #8
  9. JRS: In article <>, seen in
    news:comp.lang.javascript, Lasse Reichstein Nielsen <>
    posted at Tue, 16 Dec 2003 23:43:23 :-
    >
    >However, a quick test shows it supported by Mozilla Firebird, Opera 5+,
    >IE 6, and Netscape 4. That's very wide already.


    And MSIE 4, apparently

    The small Flanagan book has it, without specific version warning;
    overall, RegExp is "Core Javascript 1.2".

    --
    © John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
    <URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
    <URL:http://www.merlyn.demon.co.uk/js-index.htm> Jsc maths, dates, sources.
    <URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/Jsc/&c, FAQ topics, links.
     
    Dr John Stockton, Dec 17, 2003
    #9
  10. Eric Bohlman wrote:

    > Lord Khaos <> wrote in
    > news::


    It is called `attribution _line_'.

    >> [...]
    >> and it isn't an integer or boolean. So what is it's data type? and how
    >> would I merge the variable bar into it so that it is /bar/gi?

    >
    > Its data type (class) is RegExp. [...]


    Its data type is `object'. It is an instance of the RegExp object,
    meaning that this object is contained in its prototype chain. More,
    it is a RegExp object since it was created using the RegExp(...)
    constructor function (called implicitly here through the literal
    notation). There are no classes in JavaScript 1.x because it is a
    prototype-based language, not a class-based one.


    PointedEars
     
    Thomas 'PointedEars' Lahn, Dec 27, 2003
    #10
  11. Thomas 'PointedEars' Lahn <> writes:

    > Eric Bohlman wrote:
    >
    >> Lord Khaos <> wrote in
    >> news::

    >
    > It is called `attribution _line_'.


    No. Son-of-RFC-1036 speaks only of "attribution lines".
    No RFC says anything (try an RFC-search for "attribution").

    What SoRFC-1026 says (Section 4.3.2, Body Convetions):
    ---
    Some followup agents supply "attribution" lines for quoted context,
    indicating where it first appeared and under whose name. When
    multiple levels of quoting are present and quoted context is edited
    for brevity, "inner" attribution lines are not always retained. The
    editing process is also somewhat error-prone. Reading agents (and
    readers) are warned not to assume that attributions are accurate.

    UNRESOLVED ISSUE: Should a standard format for attribution lines
    be defined? There is already considerable diversity... but
    automatic news analysis would be substantially aided by a standard
    convention.
    ---
    (plus a reference to attribution lines in section 10.2)

    Alas, a standard format for attribution line*s* has not been defined.

    /L
    --
    Lasse Reichstein Nielsen -
    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
    'Faith without judgement merely degrades the spirit divine.'
     
    Lasse Reichstein Nielsen, Dec 27, 2003
    #11
  12. JRS: In article <>, seen in
    news:comp.lang.javascript, Thomas 'PointedEars' Lahn
    <> posted at Sat, 27 Dec 2003 01:45:51 :-
    >Eric Bohlman wrote:
    >
    >> Lord Khaos <> wrote in
    >> news::

    >
    >It is called `attribution _line_'.


    Ignore this would-be dictator.

    --
    © John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
    <URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
    <URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
    <URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.
     
    Dr John Stockton, Dec 28, 2003
    #12
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Lincoln
    Replies:
    3
    Views:
    452
    Chris Lincoln
    Jul 19, 2006
  2. jambiani
    Replies:
    4
    Views:
    392
    Andy Dingley
    Sep 4, 2006
  3. Kevin
    Replies:
    1
    Views:
    328
    Victor Bazarov
    Mar 8, 2006
  4. sherry
    Replies:
    0
    Views:
    422
    sherry
    Apr 15, 2009
  5. richie05 bal

    seach for pattern based on string

    richie05 bal, Aug 24, 2010, in forum: Python
    Replies:
    2
    Views:
    252
    richie05 bal
    Aug 26, 2010
Loading...

Share This Page