我正在尝试解决我在 .Net 平衡组正则表达式中发现的一个错误。
我正在尝试将!{}
匹配为开/关组合。
当前正则表达式 ->!{[^!{}]*(((?<Open>!{)[^!{}]*)+((?<Close-Open>})[^!{}]*)+)*(?(Open)(?!))}
这匹配!{some random stuff here}
成功。它也符合!{some other Stuff !{} with nesting}
但是,它根本不匹配此!{some stuff with {} just curly braces}
。字符串中的"{}"似乎引起了一些问题,因为它似乎认为该组不再"平衡">
我正在 http://regexstorm.net/tester 上测试所有这些,这是进行 .Net 特定正则表达式测试的好地方。
公平地说,我不是正则表达式专家,并且毫不羞耻地从本网站复制/操纵正则表达式 http://www.regular-expressions.info/balancing.html
我不需要它能够匹配嵌套,因为我将使用 c# 递归遍历到匹配项中,但我只需要能够在上面失败的示例上获得正匹配。
更新
以下是该模式的初始目标。就像 Razor 页面将 @{ 此处的一些 C# 代码 } 匹配为代码块一样,我使用了 !{此处的一些代码} 来划分 HTML 页面中的代码部分。我为客户编写了一个网站,他们使用这些"替换器"在他们的 html 页面中执行自定义逻辑。所以例如:
<p> Hello !{CurrentSession.GetUser().FirstName}</p>
当页面呈现时,我使用正则表达式来识别这些"替换器",然后使用 Springframework.Net 针对已知上下文执行该代码。
自 2009 年以来,这一切都非常出色(是的,10 多年前!(,但现在他们开始使用更多的 Json 类型数据,这就是我在正则表达式中发现此错误/问题的地方。
所以想象一下这个例子
<script type="text/javascript">
var myArray = [ !{CurrentSession.GetUser().GetDataOrDefault( '{Name:"MyName"}' )} ];
</script>
正如您在上面的例子中看到的,我正在尝试匹配的替换器中有带有大括号"{}"的 Json!{} 这就是正则表达式失败的地方。
PS "!"不是可选的,它必须以"!{' 并以 '}' 结尾
提前致谢
您可以使用
!{(?>[^{}]+|(?<Open>{)|(?<Close-Open>}))*}
正则表达式将找到一个感叹号,然后是一个{
,后跟任意数量的成对嵌套大括号,直到匹配的右大括号。
请参阅正则表达式演示。
详
!{
-!{
子字符串(?>[^{}]+|(?<Open>{)|(?<Close-Open>}))*
- 零次或多次重复(不允许回溯到交替原子群([^{}]+|
- 除{
和}
以外的 1+ 个字符,或(?<Open>{)|
- 推送到组"打开"堆栈的{
字符(?<Close-Open>})
- 从组"打开"堆栈弹出的}
字符,保存组"关闭"中匹配的子字符串
}
-}
字符。