2012-03-18 22 views
3

是否有正則表達式split()操作的任何應用程序不能由單個match()(或search(),findall()等)操作執行?正則表達式實現是否需要split()函數?

而不是做

subject.split('[|]') 

例如,你可以得到相同的結果一起

subject.findall('[^|]*') 

而且在幾乎所有的正則表達式引擎的調用(除了.NET和JGSoft),split()不能做一些事情,如「拆分|,除非他們逃脫\|」,因爲你需要無限重複的內部看。

因此,而不是不得不做的東西很不可讀這樣的(嵌套lookbehinds!)

splitArray = Regex.Split(subjectString, @"(?<=(?<!\\)(?:\\\\)*)\|"); 

,你可以簡單地做(甚至在JavaScript中不支持任何一種的回顧後)

result = subject.match(/(?:\\.|[^|])*/g); 

這讓我想知道:有沒有什麼在我所能做的一切split()這是不可能實現一個match()/findall()改爲?我敢打賭沒有,但我可能忽略了一些東西。

(我定義「正則表達式」在現代,非正規意義上說,即使用現代的正則表達式都在他們的處置喜歡反向引用和環視了一切。)

+1

人們可以用'find'和'substr'取代'split' ...那麼爲什麼'split'存在? (另外,即使split函數使用或可以使用正則表達式,「split」並不總是「正則表達式引擎」的函數。) – 2012-03-18 08:23:27

+0

這顯然是一種更直觀和更好的擬合函數,如果您只想分割字符串上的一些簡單的分隔符。順便說一句'(?:\\\ || [^ |])*'不會和你顯示的.NET表達式一樣,例如'foo \\ | bar'。 '(?:[^ | \\] + | \\。)*'會更好。 – Qtax 2012-03-18 09:11:00

+0

@Qtax:是的,在很多情況下,'split()'是一個非常受歡迎的「語法糖」形式。我只是想知道是不是更多。感謝您注意我的正則表達式中的錯誤;我糾正了它。 – 2012-03-18 09:27:37

回答

2

正則表達式的目的是描述語言的語法。然後可以使用這些正則表達式來查找與這些語言的語法匹配的字符串。而已。

你實際上用火柴做什麼,取決於你的需求。如果您正在查找所有匹配項,請重複查找過程並收集匹配項。如果要分割字符串,請重複查找過程並將輸入字符串拆分到找到的匹配位置。

所以基本上,正則表達式庫只能做一件事:執行搜索匹配。其他任何東西都只是擴展名。

這是一個很好的例子,其中有RegExp.prototype.exec實際上執行匹配搜索的JavaScript。 (。例如RegExp.prototype.testString.prototype.match,)接受正則表達式的任何其他方法只是使用的RegExp.prototype.exec基本功能莫名其妙:

// pseudo-implementations 
RegExp.prototype.test = function(str) { 
    return RegExp(this).exec(str); 
}; 
String.prototype.match = function(pattern) { 
    return RegExp(pattern).exec(this); 
}; 
String.prototype.search = function(pattern) { 
    return RegExp(pattern).exec(this).index; 
};