我有这样的字符串公式:
?{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}}
答案 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无匹配
<强>解释强>
(?<!^\?{[^{}]*),
- 消极看待丢弃一级逗号。这里应用的逻辑是它不应该匹配逗号前面跟着?{
后面跟着{
或}
(?=[\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}