Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
129 views
in Technique[技术] by (71.8m points)

Why this javascript regex doesn't work?

I'm doing a small javascript method, which receive a list of point, and I've to read those points to create a Polygon in a google map.

I receive those point on the form:

(lat, long), (lat, long),(lat, long)

So I've done the following regex:

(s*([0-9.-]+)s*,s([0-9.-]+)s*)

I've tested it with RegexPal and the exact data I receive:

(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)

and it works, so why when I've this code in my javascript, I receive null in the result?

var polygons="(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)";
var reg = new RegExp("/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g");
var result = polygons.match(reg);

I've no javascript error when executing(with debug mode of google chrome). This code is hosted in a javascript function which is in a included JS file. This method is called in the OnLoad method.

I've searched a lot, but I can't find why this isn't working. Thank you very much!

Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Use a regex literal [MDN]:

var reg = /(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g;

You are making two errors when you use RegExp [MDN]:

  • The "delimiters" / are should not be part of the expression
  • If you define an expression as string, you have to escape the backslash, because it is the escape character in strings

Furthermore, modifiers are passed as second argument to the function.

So if you wanted to use RegExp (which you don't have to in this case), the equivalent would be:

var reg = new RegExp("\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)", "g");

(and I think now you see why regex literals are more convenient)


I always find it helpful to copy and past a RegExp expression in the console and see its output. Taking your original expression, we get:

/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g

which means that the expressions tries to match /, s and g literally and the parens () are still treated as special characters.


Update: .match() returns an array:

["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]

which does not seem to be very useful.

You have to use .exec() [MDN] to extract the numbers:

["(25.774252, -80.190262)", "25.774252", "-80.190262"]

This has to be called repeatedly until the whole strings was processed.

Example:

var reg = /(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g;
var result, points = [];

while((result = reg.exec(polygons)) !== null) {
    points.push([+result[1], +result[2]]);
}

This creates an array of arrays and the unary plus (+) will convert the strings into numbers:

[
    [25.774252, -80.190262], 
    [18.466465, -66.118292], 
    ...
]

Of course if you want the values as strings and not as numbers, you can just omit the +.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...