Regex Lookahead / Lookbehind如果出现多次

时间:2018-02-02 13:58:27

标签: regex google-docs lookahead lookbehind

我有这样的字符串公式:

?{a,b,c,d}

它可以像这样嵌入:

?{a,b,c,?{x,y,z}}

或者这是相同的:

?{a,b,c,
    ?{x,y,z}
}

所以我必须找到那些逗号,第二个和更好的"等级"括号。 在下面的示例中,我标记了"级别"我必须找到所有逗号:

?{a,b,c,
    ?{x,y,          <--Those
        ?{1,2,3}    <--Those
    }
}

我尝试过前瞻和后视,但我现在感到很困惑:/

这是我最近的工作尝试,但它并不好: OnlineRegex

更新 为避免误解,我不想算逗号。 我想让一些逗号替换它们。

条件是找到逗号,其中有多个&#34;打开标签&#34;在此之前:?{

..没有像这样关闭标签:}

Examlpe .: 在这种情况下,我没有替换任何逗号:

?{1,2,3} ?{a,b,c}

但在这种情况下,我必须在b c

之间替换逗号
?{1,2,3,?{a,b,c}}

3 个答案:

答案 0 :(得分:1)

对于您提供的示例,以下正则表达式有效(提供您提到的所需输出):

(?<!^\?{[^{}]*),(?=[\s\S]*(?:\s*}){2,})

对于字符串?{a,b,c,d},请参阅 Demo1无匹配

对于字符串?{a,b,c,?{x,y,z}},请参阅 Demo2匹配成功

For String,

?{a,b,c,
    ?{x,y,z}
}

参见 Demo3匹配成功

For String,

?{a,b,c,
    ?{x,y,          
        ?{1,2,3}   
    }
}

参见 Demo4匹配成功

对于字符串?{1,2,3} ?{a,b,c} ?{1,2,3} ?{a,b,c},请参阅 Demo5无匹配

<强>解释

  • (?<!^\?{[^{}]*), - 消极看待丢弃一级逗号。这里应用的逻辑是它不应该匹配逗号前面跟着?{后面跟着{}
  • 之外的任何字符的0+次出现的逗号。
  • (?=[\s\S]*(?:\s*}){2,}) - 上面匹配的逗号后面必须跟至少 2次出现}(连续或只有空格)

答案 1 :(得分:0)

你的问题相当不清楚@norbre,但我认为你想提取(即“计算”)逗号的数量。 你不能用正则表达式做到这一点。正则表达式不能计算出现次数。但是,您可以使用它来提取“内部部分”,然后使用电子表格公式计算逗号数量:

^(?:\?{[a-zA-Z0-9,]+?,\n??\s*?\?{)([a-zA-Z0-9,?{}\n\s]+?(?:\n*?\s*?|})+)(?:[a-zA-Z0-9,\n\s]*})$

尝试:https://regex101.com/r/Rr0eFo/5

示例

1。 输入:

?{a,b,c,?{e,f},1,2,3}

输出:

e,f}

2。 输入:

?{a,b,c,  
    ?{x,y,z,e,  
        ?{1,2,3,?{f,g,3},4,5,6}  
}  
,d,e,f}

输出:

x,y,z,e,
        ?{1,2,3,?{f,g,3},4,5,6}
}

3。 输入:

?{a,b,c,?{e},1,2,3}

输出:

e}

(请注意,这里没有逗号!)

但有一点需要注意。正如我所说,正则表达式不能计算出现次数。 因此,以下示例(不知道它是否对您的情况有效)将返回错误匹配:

?{a,b,c,?{e,f}
    ,1,2,3,?{a,b}
}

输出:

e,f}
    ,1,2,3,?{a,b}

答案 2 :(得分:0)

确定替换逗号是另一个故事,所以我将添加另一个答案。 你的regexp引擎需要支持递归。

我仍然看不到用一个正则表达式做的方法 - 一个匹配将包含第一个逗号或包含大括号之间的所有内容!

我建议使用一个正则表达式来获取“内括号内的内容”,运行替换count()并使用正则表达式中的子匹配再次组装整行。

这是:$count = News::find($news_id)->comments()->count();

尝试:https://regex101.com/r/IzTeY0/3

示例1:
输入:

(, => "")

子匹配:
1. (\?{[^?{}]*)((?>[^?{}]|(?R))+?)([^?{}]*?\})
2. ?{a,b,c, ?{x,y,z,e, ?{1,2,3,?{f,g,3},4,5,6} } ,d,e,f}
3. ?{a,b,c,

将子匹配2中的所有逗号替换为您想要的任何内容,然后使用子匹配1和3重新分配整个字符串。

再一次,这会破坏正则表达式:

?{x,y,z,e,
        ?{1,2,3,?{f,g,3},4,5,6}
}

Submatch 2看起来像这样:


,d,e,f}