1

我需要获取有关变量的信息,而我唯一拥有的是变量名。在这种情况下,假设我需要获取属于的块SOME_LARGE_VARIABLE(每个块都以 开头<0>和结尾<0>

换句话说 ,我怎样才能得到块<0>....SOME_LARGE_VARIABLE.....<0>

注意我不想拥有<0> ...... <0> ..... SOME_LARGE_VARIABLE .... <0>

<0>
    temp
<0>
    fo0
<0>
    BLA BLA BLA
    kjfsd
    foodskjdsf
    kj
<0>
    someVariable
<0>
    SOME_LARGE_VARIABLE
<0>

到目前为止,我已经尝试过:

<0>[\s\S]*?SOME_LARGE_VARIABLE[\s\S]*?<0>

找到 <0> 然后继续直到找到 SOME_LARGE_VARIABLE 并停止直到 <0>

请注意,将选择所有内容

我的临时解决方案是:

<0>[\s\S]{1,25}SOME_LARGE_VARIABLE[\s\S]*?<0>

这将选择限制为少于 25 个字符。我认为这是有风险的,因为可能有两个小于 25 个字符的块


编辑

换句话说,我想结束:

<0>
   SOME_LARGE_VARIABLE
<0>

我唯一拥有的就是SOME_LARGE_VARIABLE知道每个块的开头和结尾都是<0>

4

1 回答 1

2

而不是使用.*?你可以使用(?:(?!<0>).)*,像这样:

<0>(?:(?!<0>).)*SOME_LARGE_VARIABLE(?:(?!<0>).)*<0>

但是您最好将字符串拆分<0>并检查哪些部分匹配SOME_LARGE_VARIABLE


请注意,表达式永远不会匹配第二个“块”:

<0> SOME_LARGE_VARIABLE   will match
<0> SOME_LARGE_VARIABLE   will not match
<0>

因为第二个<0>被表达式消耗,不允许它匹配。(拆分方式没有这个问题。)

您可以通过使用前瞻来解决这个问题:

<0>(?:(?!<0>).)*SOME_LARGE_VARIABLE(?:(?!<0>).)*(?=<0>)

如果您还想.匹配换行符,(?s)请在表达式的开头添加,如下所示:

(?s)<0>(?:(?!<0>).)*SOME_LARGE_VARIABLE(?:(?!<0>).)*(?=<0>)
于 2012-06-19T23:36:59.857 回答