最近看 php 的文檔發現很多看不懂的正則,原來之前只是會了基礎,這次來總結下幾個特殊的正則模式。js 正則表達式基礎可參考正則表達式總結。
pattern+?、pattern*?
這兩個比較常用,表示懶惰匹配,即匹配符合條件的儘量短的字符串。默認情況下 + 和 * 是貪婪匹配,即匹配儘可能長的字符串,在它們後面加上 ? 表示想要進行懶惰匹配。
(?!pattern)
表示一個過濾條件,若字符串符合 pattern 則將其過濾掉。在分析日誌時很有用,例如想過濾掉包含 info 標記的日誌可以寫 ^(?!.*info).*$。
(?:pattern)
這條規則主要是爲了優化性能,對匹配沒有影響。它表示括號內的子表達式匹配的結果不需要返回也不會被 $1 $2 之類的反向引用。
js 示例
<script>
var str3 = "haaaaaaaaaaaaaaaabaaaaaaaaaaaab";
console.log(str3.match(/h.*b/));
console.log(str3.match(/h.*?b/));
console.log(str3.match(/ha+/));
console.log(str3.match(/ha+?/));
var str = "hello123back, hello456back";
console.log(str.match(/hello(?!456).*?back/));
console.log((str.match(/(hello).*/)));
console.log((str.match(/(?:hello).*/)));
var str2 = '<input type="text" id="xxx" name="xxx" value="xxx" /><input type="hidden" id="xxx" name="xxx" value="xxx" />';
console.log(str2.match(/<input[^>]*?hidden.*?\/>/));
</script>