2014-10-19 37 views
0

想象一下,搜索包含1000个A,B,C,D,E序列的非常大的文件的情况。请注意AE是按顺序排列的,并且从不会发生E在A之前。我可以使用四个基本的RegExp语句每个A,每个B,每个C,每个D或E匹配1000次,最后从头到尾读取整个文件5次。但是,这会造成很多开销,应该是低效的。我需要能够只读取整个文件一次。对于1000套A,B,C,D,EI中的每一套,首先要找到A,然后继续读取文件以再次匹配B,C,D和E A,B,C,D,E仅在1次结束所有搜索。如何在Javascript/jQuery中通过RegExp按顺序搜索多个模式?

请注意,A,B,C,D或E的模式不同,不应混用。我们不能为所有人使用相同的模式。假设找到A的模式是“/Jac.+/”,因为B是“/ \ d + /”,因为C是“/ [\ d \ s] + /”等等。

让我举个例子。想象一下,一个文本文件由一个研究中的1000个参与者的信息组成。

text =我的名字是A.我是B岁。我在C班学习,我从D学习。我有E的孩子。

和上述5个句子重复1000次。所以像

text =我的名字是A.我是B岁。我在C班学习,我从D学习。我有E的孩子。我的名字是A.我是B岁。我在C班学习,我从D学习。我有E的孩子。我的名字是A.我是B岁。我在C班学习,我从D学习。我有E的孩子。 ...

其中A-E的值对于每种情况都不相同。

我可以使用'|' (或)在文件顶部开始阅读时搜索所有A,B,C,D和Es?

更新: 以下是摘录我的代码匹配:

var patt = /(?:"tag_A\">[\w\s\:\d\_\-\+\,\']+ | "tag_B\">[\w\s\-\d\,\'\&\;\(\)] + | "tag_C\">[\w\s\-\d\,\'\&\;\(\)] | "tag_D\">\,\s\d+" | "tag_E\">\d+)/ig; 
var result = text.match(patt); 

当我运行上面的代码,它只是找到所有作为。当我改组他们的订单并使用

var patt = /(?:"tag_B\">[\w\s\-\d\,\'\&\;\(\)] + | "tag_A\">[\w\s\:\d\_\-\+\,\']+ | "tag_C\">[\w\s\-\d\,\'\&\;\(\)] | "tag_D\">\,\s\d+" | "tag_E\">\d+)/ig; 
var result = text.match(patt); 

结果都是As,Bs和Cs。没有Ds没有Es。

我通过在patt中更改RegExp的顺序而得出不同的结果。但是,我不知道是什么导致了这种差异。当我分别匹配它们时,RegExp工作正常,这意味着它们没有错误。

+0

显而易见的问题是...你试过了吗? – charlietfl 2014-10-19 17:47:19

+0

是的,但它不起作用。尽管我仍在努力。 – Espanta 2014-10-19 18:00:15

+0

您的文件是否被分隔成可以逐一搜索每一行的行?还是仅仅是一个没有分隔符的文本流?我问,因为如果您在阅读时可以将输入分解为某种可搜索的单元,那么您可以搜索每个可搜索单元上的多个模式中的每一个,从而避免多次读取文件。 – jfriend00 2014-10-19 18:05:38

回答

0

这不是你可能想要的答案,而是在这里。

一般:

正则表达式中的从左至右的阅读顺序,先到先得/服务的命题。
这并不是说某些引擎不具备模糊/部分匹配功能,并且可以从右到左进行匹配(*咳嗽* Python)。

在任何时候,只有当前的搜索位置,没有别的。
如果你给发动机的替代品,从位置,他们互相检查独立
当其中一个替代方案完全满足特定条件时,该职位仅更改

正则表达式也是范围

这些是租户(支柱)的正则表达式。

有了这些信息,就可以将单独的正则表达式合并为一个正则表达式,其中子表达式

您优先考虑从左到右的子表达式。
例如:(?:A1 B1 C1 D1 | A2 B2 C2 D2 | A3 B3 C3 D3

虽然有一个缺点 - 如果子表达式不能优先。
问题就变成你会遇到重叠匹配的可能性。
而且,在那种情况下,不是会给出令人满意的结果。

+0

谢谢,如果我理解正确,我可以用REGEXP代替艾迪,不是吗?我不知道A-D的常数值,它是为我搜索和获取它们的RegExp。 – Espanta 2014-10-20 08:32:27

+0

我确实使用了(?:A | B | C | D),但它只匹配3个选项,而不是4个。最初只匹配其中的2个,然后我改变了顺序,它显示3,而不是I必须解决它以匹配所有4个字符串。我尝试将折叠代码更好地理解我的问题。非常感谢 – Espanta 2014-10-20 08:34:15