虽然其他方法是正确的,但使用其他方法来解析函数会更容易,这里是转换正则表达式的方法。
正则表达式不包含 JavaScript 中不可用或具有不同含义的高级构造。因此,您可以简单地在正则表达式文字中使用相同的表达式:
var r = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?([a-z0-9-.]*)\.([a-z]{2,3})(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/;
现在正则表达式不支持连接,JS 也没有x
修饰符,可以让你拆分多行的表达式。因此,如果您想将模式保留在多个部分中,要对其进行注释,则必须再次连接一个字符串并将该字符串传递给RegExp
构造函数。这里的问题是反斜杠需要加倍,因为 JavaScript 的字符串编译会吞噬每个未转义的反斜杠(因此您需要转义反斜杠以使其到达正则表达式引擎):
var rString = "((https?|ftp)\\:\\/\\/)?"; // SCHEME
rString += "([a-z0-9+!*(),;?&=\\$_.-]+(\\:[a-z0-9+!*(),;?&=\\$_.-]+)?@)?"; // User and Pass
rString += "([a-z0-9-.]*)\\.([a-z]{2,3})"; // Host or IP
rString += "(\\:[0-9]{2,5})?"; // Port
rString += "(\\/([a-z0-9+\\$_-]\\.?)+)*\\/?"; // Path
rString += "(\\?[a-z+&\\$_.-][a-z0-9;:@&%=+\\/\\$_.-]*)?"; // GET Query
rString += "(#[a-z_.-][a-z0-9+\\$_.-]*)?"; // Anchor
var r = new RegExp(rString);
在任何情况下,r
现在都可以与您最喜欢的匹配函数一起使用(match
在字符串上,或test
或exec
上r
)。