2014-02-14 51 views
1

是否有一種方法來驗證包含括號的字符串,以便表達式忽略除最後一個以外的所有字符?正則表達式來跳過所有的「)」,但最後一個字符串

正則表達式表達是這樣的:(?<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

你也可以使用[\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

+0

感謝快速回復。事實證明,這只是一點點。最後的半色調需要避免。 – Risho

+0

然後提出兩個問題:1.您使用哪種語言? 2.你正在應用正則表達式的相同字符串/文件中是否有更多的函數? – Jerry

+0

劇本是用C寫的,我只是無意中提到我過去做過很少的正則表達式,並且在我的腦海中陷入了這種困境。我基本上對發展商感到很緊張。對於給出的例子,你的建議變成了工作,但是破壞了別的東西。我可能不得不編輯我的帖子以包含更多詳細信息。 – Risho

相關問題