正则表达式跳过所有出现的“)”但字符串中的最后一个出现

时间:2014-02-14 19:21:22

标签: c# regex

有没有办法验证包含括号的字符串,以便表达式忽略除最后一个之外的所有字符串?

正则表达式是这样的:(?<function>^(?!\/_).[A-Za-z_]*)\((?<args>[^\)]+\)),字符串格式如下:

web_convert_param("sEV_4_URL2",
                  "SourceString={sEV_4}",
                  "SourceEncoding=HTML",
                  "TargetEncoding=URL",
                  "veh_sym_sel=EXT%20CAB%20(8CYL%204x2)",
                   LAST); 

如果在Regex Tester中运行此操作,则会在接下来的两个最后关闭父级停止。在这种情况下这可能吗?

运行它的C#代码如下所示:

try 
{ 
    var autoRemove = new ArrayList(ConfigurationManager.AppSettings["AutoRemoveFunctions"].Split(',')); 
    baseFileData = ScriptProperties.ScriptText; 
    var matches = regEx_SBR.Matches(baseFileData); 
    foreach (Match match in matches) 
    { 
       var functionName = match.Groups["function"].Value.Trim(); 
       if (autoRemove.Contains(functionName) || string.IsNullOrEmpty(functionName)) continue; 
       var args = match.Groups["args"].Value; 
       args = match.Groups["args"].Value.Replace("\"", "").Replace("\n", "").Replace("\r", ""); 
       var arguments = args.Split(','); 
       _scriptFunction = new BaseScriptFunction(); 
       ParseFunction(match.Groups["function"].Value.Trim(), arguments, match.Value.Trim()); 
       if (_scriptFunction.IsNamedTransaction) 
       { 
           _scriptFunction.TransactionName = string.Format("{0}{1}",transactionPrefix, _scriptFunction.TransactionName);  
       } 
       ScriptFunctions.Add(_scriptFunction); 
    } 
}

1 个答案:

答案 0 :(得分:1)

您可以使用[\s\S]并使用\);来结束正则表达式吗?像这样:

(?<function>^(?!\/_).[A-Za-z_]*)\((?<args>[\s\S]+?)\);

regex101 demo

[\s\S]匹配任何字符。您可以使用.,但也可以使用(?s)标记。


也许你可以试试这个没有最后一个分号的更好的正则表达式:

(?<function>^(?!\/_).[A-Za-z_]*)\((?<args>(?:"[^"]+"|[^\)"]+)+)\)

regex101 demo

如果您在参数字符串本身中没有任何"(转义或不转义),则此方法有效。如果您可以转义",则正则表达式必须更长......

(?<function>^(?!\/_).[A-Za-z_]*)\((?<args>(?:"(?:\\.|[^"\\]+)+"|[^\)"]+)+)\)

regex101 demo