.Net Regex 中的平衡组嵌套不正确
Balancing Groups in .Net Regex not nesting correctly
我正在努力解决我在 .Net 平衡组正则表达式中发现的错误。
我正在尝试将 !{}
匹配为 opening/closing 组合。
当前正则表达式 -> !{[^!{}]*(((?<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 页面非常相似,它匹配 @{ some C# code here } 作为代码块,我使用了 !{some code here} 的模式来划分 html 页面内的代码部分。我为客户编写了一个网站,他们在其中使用这些“替换器”在其 html 页面内执行自定义逻辑。例如:
<p> Hello !{CurrentSession.GetUser().FirstName}</p>
当页面呈现出来时,我使用 Regex 来识别那些“替换器”,然后使用 Springframework.Net 针对已知上下文执行该代码。
自 2009 年以来,这一切都运行良好(是的,10 多年前!)但现在他们开始使用更多 Json 类型的数据,这就是我发现我的正则表达式的错误/问题的地方.
想象一下这个例子
<script type="text/javascript">
var myArray = [ !{CurrentSession.GetUser().GetDataOrDefault( '{Name:"MyName"}' )} ];
</script>
正如您在上面的示例中看到的那样,我试图匹配的替换器中有 Json 和花括号“{}”!{} 这就是正则表达式失败的地方。
PS '!'不是可选的,它必须以“!{”打开并以“}”关闭
提前致谢
您可以使用
!{(?>[^{}]+|(?<Open>{)|(?<Close-Open>}))*}
正则表达式会找到一个感叹号,然后是 {
,后跟任意数量的成对嵌套大括号,直到匹配的右大括号。
参见regex demo。
详情
!{
- !{
子串
(?>[^{}]+|(?<Open>{)|(?<Close-Open>}))*
- 零次或多次重复(不允许回溯到交替原子组)
[^{}]+|
- {
和 }
或 以外的 1+ 个字符
(?<Open>{)|
- 一个 {
字符被推送到“打开”组堆栈
(?<Close-Open>})
- 从“打开”组堆栈中弹出一个 }
字符,保存在“关闭”组中匹配的子字符串
}
- 一个 }
字符。
我正在努力解决我在 .Net 平衡组正则表达式中发现的错误。
我正在尝试将 !{}
匹配为 opening/closing 组合。
当前正则表达式 -> !{[^!{}]*(((?<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 页面非常相似,它匹配 @{ some C# code here } 作为代码块,我使用了 !{some code here} 的模式来划分 html 页面内的代码部分。我为客户编写了一个网站,他们在其中使用这些“替换器”在其 html 页面内执行自定义逻辑。例如:
<p> Hello !{CurrentSession.GetUser().FirstName}</p>
当页面呈现出来时,我使用 Regex 来识别那些“替换器”,然后使用 Springframework.Net 针对已知上下文执行该代码。
自 2009 年以来,这一切都运行良好(是的,10 多年前!)但现在他们开始使用更多 Json 类型的数据,这就是我发现我的正则表达式的错误/问题的地方.
想象一下这个例子
<script type="text/javascript">
var myArray = [ !{CurrentSession.GetUser().GetDataOrDefault( '{Name:"MyName"}' )} ];
</script>
正如您在上面的示例中看到的那样,我试图匹配的替换器中有 Json 和花括号“{}”!{} 这就是正则表达式失败的地方。
PS '!'不是可选的,它必须以“!{”打开并以“}”关闭
提前致谢
您可以使用
!{(?>[^{}]+|(?<Open>{)|(?<Close-Open>}))*}
正则表达式会找到一个感叹号,然后是 {
,后跟任意数量的成对嵌套大括号,直到匹配的右大括号。
参见regex demo。
详情
!{
-!{
子串(?>[^{}]+|(?<Open>{)|(?<Close-Open>}))*
- 零次或多次重复(不允许回溯到交替原子组)[^{}]+|
-{
和}
或 以外的 1+ 个字符
(?<Open>{)|
- 一个{
字符被推送到“打开”组堆栈(?<Close-Open>})
- 从“打开”组堆栈中弹出一个}
字符,保存在“关闭”组中匹配的子字符串
}
- 一个}
字符。