3

是否有任何单个(或等)操作split()无法执行的正则表达式操作应用程序?match()search()findall()

例如,而不是做

subject.split('[|]')

你可以通过调用来获得相同的结果

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

并且在几乎所有正则表达式引擎(.NET 和 JGSoft 除外)中,split() 不能做一些事情,比如“|除非它们被转义,否则拆分\|”,因为你需要在后视中无限重复。

因此,不必像这样做一些非常难以理解的事情(嵌套的lookbehinds!)

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

你可以简单地做(即使在不支持任何后视的 JavaScript 中)

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

这让我想知道:有什么我可以做的事情是split()用单个match()/无法实现的findall()吗?我敢打赌没有,但我可能忽略了一些东西。

(我在现代、非常规的意义上定义“正则表达式”,即使用现代正则表达式拥有的一切,如反向引用和环视。)

4

1 回答 1

2

正则表达式的目的是描述一种语言的语法。然后可以使用这些正则表达式来查找与这些语言的语法匹配的字符串。就是这样。

您对比赛的实际处理取决于您的需求。如果您要查找所有匹配项,请重复查找过程并收集匹配项。如果要拆分字符串,请重复查找过程并在找到匹配项的位置拆分输入字符串。

所以基本上,正则表达式库只能做一件事:执行匹配搜索。其他任何东西都只是扩展。

一个很好的例子是 JavaScript,其中RegExp.prototype.exec实际执行匹配搜索。任何其他接受正则表达式的方法(例如RegExp.prototype.test, String.prototype.match, String.prototype.search)都只是使用了以下基本功能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;
};
于 2012-03-18T08:50:35.697 回答