0

5) 在 64 位操作系统上转到 C:\Program Files (x86)\Common gateway 6) 在 32 位上

在上面的示例中,我试图获取 5) 和 6) 之间的文本,即On 64bit OS go to C:\Program Files (x86)\Common gateway

我已经写了以下内容5[)]\s?(.*?)6[)]\s?/i,但这在这里失败了,因为我有(x86),所以我的表达将匹配 On 64bit OS go to C:\Program Files (x8

所以我正在考虑添加[^\/]所以它会跳过x86)\但它不工作......请有人帮忙。

4

5 回答 5

1

如果我正确阅读了这个问题,您希望匹配到6)unless6)是 string 的一部分(x86)。在这种情况下,请使用否定的后视断言:

/5\)\s?(.*?)(?<!\(x8)6\)\s?/i

也就是说,...匹配直到6)除非它是(x86).

于 2013-05-09T16:10:13.807 回答
1

怎么样:

5\)(.*?)\s6\)

我在 之前使用空格6)来获得你想要的东西,而你捕获的字符串中不需要这个空格,对吧?

于 2013-05-09T15:58:20.590 回答
0

这是另一种选择:

use strict;
use warnings;

while (<DATA>) {
    my ($text) = /(?:\b\d+\))(.+?)(?:\s\d+\))/;
    print "$text\n";
}

__DATA__
5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit
42)even more text 43)I think
7)Twenty four (24) 8)

输出:

 On 64bit OS go to C:\Program Files (x86)\Common gateway
even more text
Twenty four (24)

正则表达式尝试首先匹配单词边界,后跟一个+数字,然后是右括号。然后它非贪婪地捕获所有内容,直到一个空格,后跟一个+数字,然后是一个右括号。

希望这可以帮助!

于 2013-05-09T19:49:40.600 回答
-1

去简单5\)(.*6\).*)6\)应该把它全部放在$1. 而不是在正则表达式中排除任何周围的空白我会使用trim($1).

尝试匹配正则表达式中的空格的一个问题,例如 with5\)\s*(.*6\).*)\s*6\)是知道表达式的哪一部分与最右边的空格匹配6)。考虑到.*\s*6\)零件是否与.*\s*的空间相匹配text 6)?因此建议使用修剪。

于 2013-05-09T15:49:38.497 回答
-1

删除“不贪婪”的限定词。

换句话说,替换捕获模式

(.*?)

(.*)

第一个将尽可能少地匹配。第二个将尽可能匹配。

于 2013-05-09T15:52:50.697 回答