JavaScript >> Javascript 文檔 >  >> Tags >> regex

XRegExp 0.2:現在帶有命名捕獲

更新: 此版本的 XRegExp 已過時。請參閱 XRegExp.com 獲取最新、最棒的版本。

JavaScript 的正則表達式風格不支持命名捕獲。好吧,誰說? XRegExp 0.2 帶來了命名捕獲支持,以及其他幾個新功能。但首先,如果你還沒有看過之前的版本,請務必查看我在 XRegExp 0.1 上的帖子,因為並非所有文檔都在下面重複。

亮點

  • 全面的命名捕獲支持(新)
  • 通過 addFlags 支持正則表達式文字 方法 (新)
  • 自由間距和註釋模式(x )
  • 點匹配所有模式(s )
  • 與 v0.1 相比的其他幾項小改進

命名捕獲

命名捕獲有幾種不同的語法。根據我對相關庫的正則表達式支持的理解,我編制了下表。 XRegExp 的語法包含在頂部。

捕獲 返回參考 替換 存儲於
XRegExp (<name>…) \k<name> ${name} result.name
.NET (?<name>…) (?'name'…) \k<name> \k'name' ${name} Matcher.Groups('name')
Perl 5.10(測試版) (?<name>…) (?'name'…) \k<name> \k'name' \g{name} $+{name} $+{name}
Python (?P<name>…) (?P=name) \g<name> result.group('name')
PHP preg (PCRE 7) (.NET、Perl 和 Python 樣式) $regs['name'] $result['name']

目前沒有其他主要的正則表達式庫支持命名捕獲,儘管 JGsoft 引擎(由 RegexBuddy 等產品使用)同時支持 .NET 和 Python 語法。 XRegExp 不在命名捕獲組的開頭使用問號,因為這會阻止它在正則表達式文字中使用(JavaScript 會立即拋出“無效量詞”錯誤)。

XRegExp 支持基於請求的命名捕獲。您可以通過使用新的“k”將命名捕獲支持添加到任何正則表達式 " 標誌。這樣做是出於兼容性原因並確保正則表達式編譯時間在所有情況下都保持盡可能快。

以下是使用命名捕獲的幾個示例:

// Add named capture support using the XRegExp constructor
var repeatedWords = new XRegExp("\\b (<word> \\w+ ) \\s+ \\k<word> \\b", "gixk");

// Add named capture support using RegExp, after overriding the native constructor
XRegExp.overrideNative();
var repeatedWords = new RegExp("\\b (<word> \\w+ ) \\s+ \\k<word> \\b", "gixk");

// Add named capture support to a regex literal
var repeatedWords = /\b (<word> \w+ ) \s+ \k<word> \b/.addFlags("gixk");

var data = "The the test data.";

// Check if data contains repeated words
var hasDuplicates = repeatedWords.test(data);
// hasDuplicates: true

// Use the regex to remove repeated words
var output = data.replace(repeatedWords, "${word}");
// output: "The test data."

在上面的代碼中,我也使用了 x XRegExp 提供的標誌,以提高可讀性。注意 addFlags 可以在同一個正則表達式上多次調用方法(例如,/pattern/g.addFlags("k").addFlags("s") ),但為了提高效率,我建議一次性添加所有標誌。

以下是一些使用命名捕獲的示例,以及過於簡單的 URL 匹配正則表達式(有關全面的 URL 解析,請參閱 parseUri):

var url = "http://microsoft.com/path/to/file?q=1";
var urlParser = new XRegExp("^(<protocol>[^:/?]+)://(<host>[^/?]*)(<path>[^?]*)\\?(<query>.*)", "k");
var parts = urlParser.exec(url);
/* The result:
parts.protocol: "http"
parts.host: "microsoft.com"
parts.path: "/path/to/file"
parts.query: "q=1" */

// Named backreferences are also available in replace() callback functions as properties of the first argument
var newUrl = url.replace(urlParser, function(match){
	return match.replace(match.host, "yahoo.com");
});
// newUrl: "http://yahoo.com/path/to/file?q=1"

請注意,XRegExp 的命名捕獲功能不支持已棄用的 JavaScript 功能,包括 lastMatch 全局 RegExp 的屬性 對象和 RegExp.prototype.compile() 方法。

單線 (s) 和擴展 (x) 模式

XRegExp 支持的其他非本地標誌是 s (單行)“點匹配所有”模式和 x (擴展)用於“自由間距和註釋”模式。有關這些修飾符的完整詳細信息,請參閱我的 XRegExp 0.1 帖子中的常見問題解答。但是,與之前版本的一個區別是 XRegExp 0.2,當使用 x 標誌,現在允許正則表達式標記與其量詞之間的空白(量詞是,例如,+ , *? , 或 {1,3} )。儘管記錄了先前版本在這方面的處理/限制,但與其他正則表達式庫相比,它是非典型的。此問題已修復。

下載

XRegExp 0.2.5 .

XRegExp 已在 IE 5.5–7、Firefox 2.0.0.4、Opera 9.21、Safari 3.0.2 beta for Windows 和 Swift 0.2 中進行了測試。

最後,請注意 XRE v0.1 中的對像已被刪除。 XRegExp 現在只創建一個全局變量:XRegExp .永久覆蓋原生 RegExp 構造函數/對象,你現在可以運行 XRegExp.overrideNative();

更新: 此版本的 XRegExp 已過時。請參閱 XRegExp.com 獲取最新、最棒的版本。


Tutorial JavaScript 教程
  1. 將 Google reCAPTCHA v3 添加到 Angular 應用程序

  2. HTTP 服務器控制器和路由的 Typescript 裝飾器

  3. 反應文件夾結構

  4. Jest 相當於 RSpec 惰性求值變量(let)?

  5. 具有自動完成功能的強大搜索引擎的電子商務網站

  6. 如何創建您的第一個 Express.js Web 應用程序?

  7. Node.js 的非技術印象

  1. 什麼是 Redux:設計師指南

  2. 你的替代解決方案是什麼?挑戰#45

  3. 博蒂。使用 socket.io 和 nodeJS(開源)的基本對話機器人。

  4. substring() 方法

  5. 如何填充數組中的值

  6. 使用 Axios 和 React 發出 API 請求

  7. 如何在 Vuejs 中有條件地禁用輸入字段

  1. 我的第一個訓練營項目:河內塔

  2. 帶有 React 和 D3 的簡單條形圖📊

  3. JavaScript - 僅檢查空值的更好方法!

  4. 數據驅動的 JavaScript 控件