【问题标题】:Complex regex with custom formula builder带有自定义公式生成器的复杂正则表达式
【发布时间】:2011-10-01 09:05:58
【问题描述】:

我有一个这样的字符串 - MVAL("A","01-01-1900")+MVAL(B,"01-01-1900")+MVAL("C")+MVAL(D)。现在我想使用正则表达式从中提取BD,因为它是第一个参数,并且在两个函数的重载版本中都没有引号。其次,因为MVAL函数是一个重载函数,有MVAL("A")MVAL(B,"01-01-1900")这两个版本,我该如何找到正在使用的函数版本。

请帮忙。我正在使用System.Text.RegularExpressions.Regex 方法。

【问题讨论】:

    标签: regex vb.net string .net-2.0


    【解决方案1】:

    是否可以安全地假设第一个参数后面永远不会有逗号,除非它后面跟着第二个参数?如果是这样,这应该就是你所需要的:

    string s = @"MVAL(""A"",""01-01-1900"")+MVAL(B,""01-01-1900"")+MVAL(""C"")+MVAL(D)";
    
    foreach (Match m in Regex.Matches(s, @"MVAL\((\w+)(,)?"))
    {
      Console.WriteLine("First param: {0}\nHas second param? {1}\n",
                        m.Groups[1], m.Groups[2].Success);
    }
    

    输出:

    First param: B
    Has second param? True
    
    First param: D
    Has second param? False
    

    如果没有逗号,整体匹配仍然会成功,因为逗号是可选的。但是,因为第二个捕获组没有参加比赛,所以它的Success属性设置为False

    此正则表达式还假定字符串中永远不会有任何空格,如您的示例所示。这个正则表达式允许语法元素之间有空格:

    @"MVAL\s*\(\s*(\w+)\s*(,)?
    

    【讨论】:

    • 如果我有三个 MVAL 参数怎么办,那么像这样的工作MVAL\((\w+)(,)(\w+)(,)(\w+)
    • 嗯,这将匹配MVAL(A,B,C),但不匹配MVAL("A","B","C")
    【解决方案2】:

    看起来您只是想匹配文本 MVAL( 后跟一个字母(或者可能是一个标识符)。试试这个:

    MVAL\(([A-Z])
    

    第一部分 MVAL\( 匹配前缀。然后我们有一些用括号括起来的文本:([A-Z])。括号告诉正则表达式引擎“捕获”内容将匹配的任何文本,这意味着我们以后可以使用它。这就是为什么我们必须在前缀中使用反斜杠来转义开头的那个。

    [A-Z] 模式匹配AZ 之间的任何字符。这包括所有大写字母字符。然后我们告诉正则表达式引擎忽略大小写,因此它也匹配所有小写字符。

    Dim regex = new Regex("MVAL\(([A-Z])", RegexOptions.IgnoreCase)
    Dim match = regex.Match(input)
    Dim parameter = match.Groups(1)
    

    如果您想匹配任何有效标识符而不仅仅是单个字母,请尝试以下操作:

    MVAL\(([A-Z_][A-Z0-9_]*)
    

    捕获的部分将匹配任何字母或下划线,后跟零个或多个(由* 表示)字母、数字或下划线。

    【讨论】:

    • 小心,[A-z] 还匹配 ASCII Z 和 ASCII a 之间的一些非字母。更好地使用 [A-Z]Regex.IgnoreCase
    • 是的,但是我如何确定这个正则表达式是否总是选择第一个参数。
    • @SohamDasgupta:结果如何?不匹配吗?
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多