string.seach() RegEx question

L

Lord Khaos

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
 
E

Evertjan.

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>
 
G

Grant Wagner

Lord said:
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 <[email protected]>

* 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
 
L

Lord Khaos

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
 
E

Eric Bohlman

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.
 
E

Eric Bohlman

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.
 
L

Lasse Reichstein Nielsen

[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
 
G

Grant Wagner

Lasse said:
[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 <[email protected]>

* 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
 
D

Dr John Stockton

JRS: In article <[email protected]>, seen in
news:comp.lang.javascript said:
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".
 
T

Thomas 'PointedEars' Lahn

Eric said:

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
 
L

Lasse Reichstein Nielsen

Thomas 'PointedEars' Lahn said:
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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top