当前位置: 首页 > 知识库问答 >
问题:

如何排除嵌套括号内的正则表达式匹配

吕永寿
2023-03-14

我有这样一个文本:

UseProp1?(Prop1?Prop1:Test):(UseProp2?Prop2:(Test Text: '{TextProperty}' Test Reference:{Reference}))

我试图在c#中使用正则表达式来提取嵌套的if/eles-段。

要查找“?”,我使用了:

模式1:\?\s*(?![^()]*\)

找到“:”我用了:

模式2:\:\s*(?![^()]*\))

当有一个级别的括号时,这很好,但当嵌套它们时就不行了。

我使用此在线工具简化了测试:http://regexstorm.net/tester (并插入图案-1和上面的输入)

如你所见,它突出了两场比赛,但我只想要第一场。您还会注意到第一个括号被忽略了,但下一个嵌套级别的括号没有被忽略

我希望比赛名单是:

1) 使用建议1

2) (Prop1?Prop1:测试):(UseProp2?Prop2:(测试文本:“{TextProperty}”测试引用:{Reference}))

我现在得到的是:

1) 使用建议1

2) (Prop1?Prop1:测试):(使用Prop2

3) Prop2:(测试文本:{TextProperty}测试引用:{Reference}))


共有2个答案

程俊誉
2023-03-14

如果我理解正确,并且我们希望只捕获两个列出的格式,我们可以从一个简单的表达式开始使用交替,然后我们会修改它的隔间,如果我们愿意的话:

UseProp1|(\(?Prop1\?Prop1(:Test)\)):(\(UseProp2\?Prop2):\((Test\sText):\s+'\{(.+?)}'\s+Test\sReference:\{(.+?)}\)\)
using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"UseProp1|(\(?Prop1\?Prop1(:Test)\)):(\(UseProp2\?Prop2):\((Test\sText):\s+'\{(.+?)}'\s+Test\sReference:\{(.+?)}\)\)";
        string input = @"UseProp1
(Prop1?Prop1:Test):(UseProp2?Prop2:(Test Text: '{TextProperty}' Test Reference:{Reference}))
";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

如果不需要这个表达式,并且您希望修改它,请访问regex101.com.

jex.im将正则表达式可视化:

袁轶
2023-03-14

扩展@bobble泡沫的评论,这是我的正则表达式:

它将捕获三元函数的第一层。捕获组:$1是条件子句,$2是true子句,$3是false子句。然后,您必须在每一个表上匹配正则表达式,才能在树的下面更进一步:

((?:\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\))+|\b[^)(?:]+)+\?((?:\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\))+|\b[^)(?:]+)+\:((?:\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\))+|\b[^)(?:]+)+

代码输入测试仪

这就是说,如果您也在这些表达式中计算数学,那么使用运行时编译器为您完成所有繁重的工作可能更有价值。如果你愿意,这个答案将帮助你朝这个方向设计。

 类似资料:
  • 问题内容: 我一直试图在Java中编写一个正则表达式以删除下面括号中的所有内容,同时保留其他所有内容。 注意,括号可以嵌套,这就是为什么我的模式失败的原因 。有人能帮我吗?下面我试过了: 但这打印: d4 Nf6 2. c4 g6 3. Nc3 Bg7 4. e4 d6 5. Nf3 OO 6. Be2 e5 7. dxe5 dxe5 8. Qxd8 Rxd8 9. Bg5 Nbd7 10. OO

  • 正如标题所说,以下是一个输入示例: 当然,匹配的字符串将通过递归进行处理。 我希望第一个递归匹配: 之后的过程不用说。。。

  • 问题内容: 我正在尝试匹配带有嵌套括号的类似数学表达式的字符串。 [‘((((1 + 0)+1)+1)’] 我希望它与所有包含的表达式匹配,例如(1 + 0),((1 + 0)+1)… 我什至不在乎它是否匹配不需要的表达式,例如(((1 + 0),我可以照顾的。 为什么它还没有这样做,我该怎么做? 问题答案: 正则表达式尝试匹配尽可能多的文本,从而消耗了所有字符串。它不会在字符串的一部分上寻找正则

  • 问题内容: 我正在尝试编写一个匹配嵌套括号的正则表达式,例如: 这样的字符串应该匹配,导致所有嵌套括号都被关闭,而是: 不应该或更好地至少匹配第一个“(((text)))(text)”部分。 实际上,我的正则表达式是: 但这并不能像我期望的那样正常工作。如何解决?我哪里错了?谢谢! 问题答案: 当我找到此答案时,我无法弄清楚如何修改模式以使用自己的定界符where 和。所以我的方法是使其更通用。

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 上面的正则表达式返回括号之间的文本。 如: 如何重写上面的正则表达式,所以我提供了一个类似的字符串,它将返回。i、 e带括号的部分,其中包含大括号中的字符串。