JavaScript 的特性借鑑許多語言:
可處理正則表達式的方法:
這邊有個範例要找對應分配的 URL。
var parse_url = /^(?:([A-Za-z+]:)?(\/(0,3))([0-9.\-A-Z-a-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url = "https://www.ora.com:80/goodparts?q#frament";
var result = parse_url.exec(url);
var names = ['url', 'scheme', 'slash', 'host', 'port', 'path', 'query', 'hash'];
var blanks = ' ';
var i;
for (i = 0; i < name.length; i += 1) {
document.wrintIn(name[i] + ':' +
blanks.substring(name[i].length), result[i]);
}
使用 parse_url
的 exec
方法,傳入字串比對成功則回傳擷取自 url 的零碎字串陣列。
得到結果如下
現在讓我們開始解析 parse_ url ,
var parse_url = /^(?:([A-Za-z+]:)?(\/(0,3))([0-9.\-A-Z-a-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
^
:指出字串的開始,為一個定位點,阻止 exec 跳過不像 URL 的字首。(?:([A-Za-z+]:)?
:這個字段比對 scheme 名稱,名稱後面必須接:
。(?:...)
:表示本段落非記憶集結,字尾?
表示該集結為選用集結。(...)
:括號表示一個記憶集結。選用:重複零或一次。[...]
:字元類組,以這次的[A-Za-z+]
來說,就是包含二十六個大小寫字母。
-
指範圍連字號。+
用於字元類組用於一或多次比對。這個群組緊接在:
字元後,比對時將照字面如實比對。result[1]
。
(\/{0,3})
\/
比對是否有/
斜線字元,它被\
反斜線字元轉義,所以不會被翻譯為正規式實字的結尾。{0,3}
意指它前面的/
可以出現 1~3次。([0-9.\-A-Za-z]+)
-
需做轉義,表示為\-
,避免誤解為範圍連字號。(?::(/d+))?
\d
表示數字字元。一或多個數字則是第四個記憶集結。(?:\/([^?#]*))?
/
。[^?#]
起始為^
,代表類組包含所有字元,但?
與#
除外。*
則表示前面的字元類組應出現零或多次。(?:\?([^#]*))?
?
起始的選用集結,它包含第六個記憶集結,負責比對零或多個字元(不含#)。(?:#(.*))?
#
起始,「.」用於比對任何字元,但行末字元除外。$
var parse_number = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i;
var test = function (num) {
document.writeln(parse_number.test(num));
};
test('l'); //true
test('number'); //false
test('98.6'); //true
test('132.21.86.100'); //false
test('123.45E-67'); //true
test('123.45D-67'); //false
parse_number 可以分辨符合規格和不符合的字串,但看不出來哪裡不符合,那現在來分解:
/^ $/I
看到定位點^
和$
,所以字串中的所有字元要跟正規式比對。
省略定位點,正規表示字串中是否包含數字;
有了定位點,正規表示字串中是否只有數字。
如果採用 ^
,可對出以數字起始的字串,
如果採用 $
,可對出以數字結尾的字串。
i 找到相符合文字,忽略大小寫的差異,樣式中唯一一個字元就是 e,我們希望 e 也能找出 E,這個部分寫成 [Ee] 或 (?:E|e) ,也可以達到相同效果。
-?
負號(-)後的字尾,表示負號為選用。
\d+
\d
與[0-9]
相同,用來比對數字。字尾+
要求前面的數字出現一次或多次。
(?:\.|d*)?
(?:...)
表示一個非記憶集結。
(?:...)
也是一個非記憶集結,可比對出 e 或 (E),加上選用正負號,以及一或多個數字。
資料來源:《JavaScript 優良部份》 Douglas Crockford 著 歐萊禮
筆記純屬推廣及分享,如有侵權,請告知。
Please advise to remove immediately if any infringement caused.