正则表达式匹配第一行定义的文本块

时间:2014-02-25 10:13:03

标签: regex match regex-negation

我有一个文件,我希望用正则表达式解析。到目前为止,它已经为许多不同的文件工作,但这个需要不同的东西。我有以下示例文本:

Test1 £4000 £5000
Here street
Here
UK
Test2 £2 £1000
There street
There
UK
Test3 £100 £1000
Haha street
Funnyville
Ireland

对于第一个,例如,我需要获得3件事,£4000£5000

Test1
Here street
Here
UK

我正在使用正则表达式字符串((.*)[^\x00-\x7F](.*)[^\x00-\x7F](.*)\n((.*\n){1,5})),它在某种程度上使其正确但只匹配Test1Test3。您可以在http://regex101.com/r/tT9pR8

看到此示例

我正试图找到一种方法,在这部分((.*\n){1,5})中说明该行不能包含£符号。 ([^\x00-\x7F])。我尝试了几种不同的方法,例如使用^[^\x00-x7F]但没有返回任何匹配。

匹配此项的最佳方式是什么?注意:必须使用正则表达式,对于任何想知道的人。

编辑:文本实际上被不应匹配的其他文本包围。实际文本类似于下面的内容,下面使用Robin的答案将“START STRING”和“END STRING”与第一个和最后一个匹配相匹配。 “START STRING”和“END STRING”将是常量。见http://regex101.com/r/gM6vL0

START STRING
Test1 £4000 £5000
Here street
Here
UK
Test2 £2 £1000
There street
There
UK
Test3 £100 £1000
Haha street
Funnyville
Ireland
END STRING

编辑2:END STRING实际上更像END STRING £4545 £4554定义,因此它与罗宾的模式相匹配,如http://regex101.com/r/oC0xL2所示

此外,文件中还有其他与模式匹配的事件,而不在START STRINGEND STRING之间,因此不应匹配/

1 个答案:

答案 0 :(得分:1)

轻松解决方案

拆分字符串:仅保留START STRINGEND STRING之间的部分,然后应用

/^([^£]*)(£\d+)\s(£\d+)([^£]*)(?=^.*£|$)/gm

将无限制地匹配您的模式

酷正则表达式解决方案

如果您需要在 START STRING之后立即匹配这些模式(没有真正检查结尾是END STRING而不仅仅是{{1}的行虽然),这应该做的伎俩

£

这会捕获/(?:START STRING|(?!\A)\G([^£]*)(£\d+)\s(£\d+)([^£]*)(?=^.*£|END STRING))/gm Test1£4000

£5000

在这里演示:http://regex101.com/r/gR4vM5

说明

Here street
Here
UK