首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JScript 正則表達式完整教學:RegExp 物件、String 方法、進階替換技巧與實戰範例

     編輯:關於JSP

正則表達式是文字處理的瑞士刀。JScript (Microsoft 的 ECMAScript 3 實作) 提供 `RegExp` 物件與 `String` 相關方法,雖然語法與現代 JavaScript (ES5+) 大同小異,但仍有獨特屬性 (如靜態 `RegExp.$1`、$`、$' 等)。本文系統整理建立、匹配、替換、屬性存取等核心用法,並展示語法高亮、樣板引擎等實戰模式。

建立 RegExp 物件:兩種方式

// 1. 建構函式 (需雙重跳脫)
var re1 = new RegExp("\\w+", "igm"); // 字串中 \ 需寫 \\

// 2. 字面量語法 (推薦,可讀性高、無需跳脫)
var re2 = /\w+/igm;

旗標:`i` (忽略大小寫)、`g` (全域匹配)、`m` (多行模式 `^$` 匹配行首尾)。

RegExp 核心方法

方法說明回傳值
exec(str)執行匹配,**可迭代** (配合 `g` 旗標),每次從 `lastIndex` 開始匹配陣列 (含 index、input、groups) 或 null
test(str)僅檢查是否匹配true / false
compile(pattern, flags)預編譯正則 (舊版優化),現代引擎自動優化,**不建議使用**RegExp 物件本身

exec() 迭代匹配標準模式

var re = /\w+/g;
var str = "Hello World 123";
var match;
while ((match = re.exec(str)) !== null) {
    console.log("匹配:", match[0], "位置:", match.index, "下一起始:", re.lastIndex);
}
// 輸出:
// 匹配: Hello 位置: 0 下一起始: 5
// 匹配: World 位置: 6 下一起始: 11
// 匹配: 123 位置: 12 下一起始: 15
關鍵:`exec` 配合 `g` 旗標才會更新 `lastIndex` 實現迭代;無 `g` 旗標每次都從頭匹配,導致無限迴圈。

RegExp 靜態屬性 (JScript 獨有/非標準)

執行 `exec()` 或 `test()` 後,`RegExp` 建構函式本身會更新下列**靜態屬性** (全域共享,非執行緒安全):

屬性說明
RegExp.$1 ~ RegExp.$9最近一次匹配的第 1~9 組捕獲群組內容
RegExp.lastMatch / RegExp['$&']最近一次匹配的完整字串
RegExp.lastParen / RegExp['$+']最近一次匹配的**最後一組**捕獲群組內容
RegExp.leftContext / RegExp['$`']目標字串中匹配位置**之前**的所有內容
RegExp.rightContext / RegExp["$'"]目標字串中匹配位置**之後**的所有內容
RegExp.input / RegExp['$_']最近一次傳入 `exec/test` 的目標字串
RegExp.lastIndex下一次匹配起始位置 (同實例屬性)
**警告**:靜態屬性為**全域共享**,多執行緒/非同步環境下極易互相干擾。**現代程式碼請改用 `exec()` 回傳陣列或 `String.prototype.matchAll()` (ES2020)**。

String 正則相關方法

方法說明關鍵差異
match(regexp)匹配字串無 `g` 時同 `exec`;有 `g` 時回傳**所有匹配字串陣列** (無捕獲群組資訊)
replace(regexp, replacement)替換匹配內容**支援函式回呼** 與**特殊替換變數** (見下)
search(regexp)搜尋首個匹配位置回傳索引或 -1,忽略 `g` 旗標
split(regexp, limit)分割字串分隔符可為正則

replace() 進階替換變數 (核心亮點)

第二參數為字串時,支援下列**特殊變數** (類似 Perl):

變數代表內容
$&完整匹配字串 (同 `lastMatch`)
$1 ~ $99第 1~99 組捕獲群組
$`左側文本 (`leftContext`)
$'右側文本 (`rightContext`)
$$字面 `$` 字元

實戰:關鍵字高亮 (語法著色核心邏輯)

var code = "function hello() { return 'world'; }";
var keywords = /\b(function|return|var|if|else|for|while)\b/g;

// 替換為 關鍵字
var highlighted = code.replace(keywords, '<span class="kw">$&</span>');

console.log(highlighted);
// 輸出: function hello() { return 'world'; }

實戰:函式回呼替換 (動態計算替換內容)

// 將所有數字乘 2
var text = "價格: 10, 數量: 3, 總計: 30";
var result = text.replace(/\d+/g, function(match, offset, string) {
    return parseInt(match) * 2;
});
console.log(result); // "價格: 20, 數量: 6, 總計: 60"

// 更複雜:解析模板 {{name}} → 資料對應值
var template = "你好, {{user}}! 你的等級: {{level}}";
var data = { user: "小明", level: "VIP" };
var rendered = template.replace(/\{\{(\w+)\}\}/g, function(match, key) {
    return data[key] || match; // 找不到保留原樣
});
console.log(rendered); // "你好, 小明! 你的等級: VIP"

完整實戰範例:簡易程式碼語法高亮器

<html><body>
<textarea id="codeInput" rows="15" cols="80">
function factorial(n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}
</textarea>
<button onclick="highlight()">高亮顯示</button>
<pre id="output" style="border:1px solid #ccc; padding:10px; background:#f8f8f8;"></pre>

<script>
function highlight() {
    var code = document.getElementById("codeInput").value;
    
    // HTML 編碼防 XSS
    code = code.replace(/&/g, "&").replace(//g, ">");
    
    // 定義規則陣列:[正則, CSS類別]
    var rules = [
        [/\b(function|return|var|if|else|for|while|do|break|continue|switch|case|default|try|catch|finally|throw|new|this|typeof|instanceof|in|delete|void)\b/g, "kw"],
        [/\b(true|false|null|undefined|NaN|Infinity)\b/g, "literal"],
        [/\b\d+(\.\d+)?\b/g, "number"],
        [/"([^"\\]|\\.)*"/g, "string"],
        [/'([^'\\]|\\.)*'/g, "string"],
        [/\/\/.*$/gm, "comment"],
        [/\/\*[\s\S]*?\*\//g, "comment"]
    ];
    
    // 為避免標籤巢狀破壞,採用「佔位符法」:先替換為唯一標記,最後一次性轉換
    var placeholders = [];
    rules.forEach(function(rule, i) {
        var regex = rule[0], cls = rule[1];
        code = code.replace(regex, function(match) {
            var ph = "@@PH" + i + "_" + placeholders.length + "@@";
            placeholders.push({ ph: ph, html: '<span class="' + cls + '">' + match + '</span>' });
            return ph;
        });
    });
    
    // 還原佔位符
    placeholders.forEach(function(p) {
        code = code.replace(p.ph, p.html);
    });
    
    document.getElementById("output").innerHTML = code;
}
</script>

<style>
.kw { color: #0000ff; font-weight: bold; }
.literal { color: #008000; }
.number { color: #ff0000; }
.string { color: #800080; }
.comment { color: #008000; font-style: italic; }
</style>
</body></html>

工具與資源

  • RegexBuddy:最強正則設計/測試/除錯工具 (付費),支援 JScript/.NET/Java/Python 等多引擎模擬。
  • Regex101.com:線上免費測試、解釋、生成代碼 (支援 JavaScript/PCRE/Python/Go)。
  • MSDN JScript Regular Expression Syntax:官方文件參考。

從 JScript 遷移到現代 JavaScript (ES6+) 差異提醒

  • `String.prototype.matchAll(regexp)`:回傳迭代器,取代 `exec` 迴圈,支援捕獲群組完整資訊。
  • `String.prototype.replaceAll(searchValue, replaceValue)`:直接全域替換字串,無需 `g` 旗標正則。
  • 命名捕獲群組:`/(?\d{4})-(?\d{2})/` → `match.groups.year`。
  • `s` (dotAll) 旗標:`.` 匹配換行符。
  • Unicode 屬性逃逸:`/\p{Script=Han}/u` 匹配中文字符。
  • 查找/斷言:`(?=...)`, `(?!...)`, `(?<=...)`, `(?
JScript 正則核心:`RegExp` 物件 + `exec/test` + `String.replace` 替換變數 (`$&`、`$1`、`$``、`$'`)。**掌握替換函式回呼與佔位符技巧,即可實作語法高亮、模板引擎、資料清洗等複雜文字轉換**。現代專案請優先使用 ES6+ 標準 API (`matchAll`、命名群組、斷言) 並配合 TypeScript 型別檢查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved