2013-06-11 24 views
1

我想使用发生在另一个文本模式之前的最后一个文本模式。正则表达式:发生在另一个模式之前的模式的最后一次发生

例如,我有这样的文字:

code 4ab6-7b5 
Another lorem ipsum 
Random commentary. 

code f6ee-304 
Lorem ipsum text 
Dummy text 

code: ebf6-649 
Other random text 
id-x: 7662dd41-29b5-9646-a4bc-1f6e16e8095e 

code: abcd-ebf 
Random text 
id-x: 7662dd41-29b5-9646-a4bc-1f6e16e8095e 

我想采取的id-x第一次出现之前发生(这意味着我要获取代码ebf6-649

我怎样才能最后code用正则表达式来做这件事?

+0

我使用Git的bash,所以我认为这是UNIX引擎 –

+0

通过“用正则表达式”,我认为你的意思是“用git-bash”? (我的意思是,为什么你关心,如果答案恰巧使用正则表达式?) – ruakh

+0

@JasonSwartz我实际上认为这个问题的以前版本是完全正确的,并会给你更有用的答案。这种有限形式的解决方案可能会在您的实际投入中产生误报。 –

回答

7

如果您正则表达式的味道支持lookaheads,你可以使用这样

^code:[ ]([0-9a-f-]+)(?:(?!^code:[ ])[\s\S])*id-x 

的解决方案,你可以找到你的结果在捕获数1

它是如何工作的?

^code:[ ]   # match "code: " at the beginning of a line, the square 
        # brackets are just to aid readability. I recommend always 
        # using them for literal spaces. 

(     # capturing group 1, your key 
    [0-9a-f-]+  # match one or more hex-digits or hyphens 
)     # end of group 1 

(?:     # start a non-capturing group; each "instance" of this group 
        # will match a single arbitrary character that does not start 
        # a new "code: " (hence this cannot go beyond the current 
        # block) 

    (?!    # negative lookahead; this does not consume any characters, 
        # but causes the pattern to fail, if its subpattern could 
        # match here 

    ^code:[ ]  # match the beginning of a new block (i.e. "code: " at the 
        # beginning of another line 

)     # end of negative lookahead, if we've reached the beginning 
        # of a new block, this will cause the non-capturing group to 
        # fail. otherwise just ignore this. 

    [\s\S]   # match one arbitrary character 
)*     # end of non-capturing group, repeat 0 or more times 
id-x    # match "id-x" literally 

(?:(?!stopword)[\s\S])*模式让我们你尽可能的匹配,而不超出的stopword另一个发生。

请注意,对于^,您可能必须使用某种形式的多行模式才能匹配行首。如果您的random text包含open:,则^对于避免错误否定很重要。

Working demo(使用Ruby的正则表达式的味道,因为我不知道哪一个,你最终要使用)

相关问题