【问题标题】:Regex to match blocks of text defined by first line正则表达式匹配第一行定义的文本块
【发布时间】:2014-02-25 10:13:03
【问题描述】:

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

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,因此它与 Robin 的模式相匹配,如 http://regex101.com/r/oC0xL2 所示

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

【问题讨论】:

    标签: regex match regex-negation


    【解决方案1】:

    简单的解决方案

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

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

    这将无限制地匹配您的模式

    很酷的正则表达式解决方案

    如果你需要匹配这些模式只在一个START STRING之后(没有真正的检查结束是END STRING,而不仅仅是£的一行),这个应该做的伎俩

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

    这将捕获Test1£4000£5000

    Here street
    Here
    UK
    

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

    解释

    (?:                              # non capturing parenthesis
        START STRING                 # either START STRING
    |                                # or
        (?!\A)\G                     # end of the last match (but not the begin of the string)
        ([^£]*)(£\d+)\s(£\d+)([^£]*) # the wanted pattern
        (?=^.*£|END STRING))         # check that the next line either contains £ or START STRING
    )
    

    【讨论】:

    • 对不起,请参阅上面的编辑。忘了说这会被其他文字包围。
    • @anothershrubery:更新了答案。但是,此解决方案不会考虑 START STRING,这意味着它不会仅在这两个开始和结束字符串内进行搜索,如果您的一般字符串中的其他数据类似于此模式,这可能会导致误报。这是个问题吗?
    • 我刚刚在文本上测试了这一点,并且还有其他地方的模式确实匹配,所以不幸的是并不完全合理。
    • @anothershrubery:这应该是更好的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2022-01-25
    • 2014-06-30
    相关资源
    最近更新 更多