C# 可能是一个简单的正则表达式
对于正则表达式,我是一个完全的新手,我想帮助您制作一个表达式来匹配以下内容:C# 可能是一个简单的正则表达式,c#,.net,regex,C#,.net,Regex,对于正则表达式,我是一个完全的新手,我想帮助您制作一个表达式来匹配以下内容: {ValidFunctionName}({parameter}:"{value}") {ValidFunctionName}({parameter}:"{value}", {parameter}:"{value}") {ValidFunctionName}() 其中{x}是我想要匹配的,{parameter}可以是任何$%“$例如,{value}必须用引号括起来 T
{ValidFunctionName}({parameter}:"{value}")
{ValidFunctionName}({parameter}:"{value}",
{parameter}:"{value}")
{ValidFunctionName}()
其中{x}是我想要匹配的,{parameter}可以是任何$%“$例如,{value}必须用引号括起来
ThisIsValid_01(a:"40")
ThisIsValid_02()
将是“这是有效的”\u 01、“a”、“40”
将是“这是有效的”01、“a”、“40”、“b”、“动物园”
我什么都不还
ThisIsntValid_02(a:40)
不会返回任何内容,因为40没有用引号括起来
ThisIsValid_01(a:"40")
ThisIsValid_02()
将返回“ThisIsValid\u 02”
对于一个有效的函数名,我遇到了:“[a-Za-z_][a-Za-z_0-9]*”
但我一辈子都想不出如何与其他人相匹配。
我一直在尝试在所有条件下获得有效的匹配,但没有效果:(
如果您也能善意地解释一下正则表达式,那就太好了,这样我就可以了解:)编辑:这将起作用,使用2个正则表达式。第一个正则表达式获取函数名和其中的所有内容,第二个正则表达式从函数的括号中提取每对参数和值。您不能使用单个正则表达式来执行此操作。添加一些
[\t\n\r]*
用于空格
Regex r = new Regex(@"(?<function>\w[\w\d]*?)\((?<inner>.*?)\)");
Regex inner = new Regex(@",?(?<param>.+?):""(?<value>[^""]*?)""");
string input = "_test0(a:\"lolololol\",b:\"2\") _test1(ghgasghe:\"asjkdgh\")";
List<List<string>> matches = new List<List<string>>();
MatchCollection mc = r.Matches(input);
foreach (Match match in mc)
{
var l = new List<string>();
l.Add(match.Groups["function"].Value);
foreach (Match m in inner.Matches(match.Groups["inner"].Value))
{
l.Add(m.Groups["param"].Value);
l.Add(m.Groups["value"].Value);
}
matches.Add(l);
}
编辑:现在您已经添加了未定义数量的多个参数,我建议您创建自己的解析器,而不是使用正则表达式。上面的示例仅适用于一个参数,并且严格没有空格。这将使用严格的空格匹配多个参数,但不会返回参数和值:
\w[\w\d]*?\(.+?:"[^"]*?"(,.+?:"[^"]*?")*\)
只是为了好玩,如上所述,但使用WhiteSpace:
\w[\w\d]*?[ \t\r\n]*\([ \t\r\n]*.+?[ \t\r\n]*:[ \t\r\n]*"[^"]*?"([ \t\r\n]*,[ \t\r\n]*.+?[ \t\r\n]*:[ \t\r\n]*"[^"]*?")*[ \t\r\n]*\)
捕获您想要的文本将很困难,因为您不知道要捕获多少个,因此正则表达式不合适。编辑:这将起作用,使用2个正则表达式。第一个获取函数名和其中的所有内容,第二个从函数的括号中提取每对参数和值ets。您不能使用单个正则表达式执行此操作。请为空格添加一些
[\t\n\r]*
Regex r = new Regex(@"(?<function>\w[\w\d]*?)\((?<inner>.*?)\)");
Regex inner = new Regex(@",?(?<param>.+?):""(?<value>[^""]*?)""");
string input = "_test0(a:\"lolololol\",b:\"2\") _test1(ghgasghe:\"asjkdgh\")";
List<List<string>> matches = new List<List<string>>();
MatchCollection mc = r.Matches(input);
foreach (Match match in mc)
{
var l = new List<string>();
l.Add(match.Groups["function"].Value);
foreach (Match m in inner.Matches(match.Groups["inner"].Value))
{
l.Add(m.Groups["param"].Value);
l.Add(m.Groups["value"].Value);
}
matches.Add(l);
}
编辑:现在您已经添加了未定义数量的多个参数,我建议您创建自己的解析器,而不是使用正则表达式。上面的示例仅适用于一个参数,并且严格没有空格。这将使用严格的空格匹配多个参数,但不会返回参数和值:
\w[\w\d]*?\(.+?:"[^"]*?"(,.+?:"[^"]*?")*\)
只是为了好玩,如上所述,但使用WhiteSpace:
\w[\w\d]*?[ \t\r\n]*\([ \t\r\n]*.+?[ \t\r\n]*:[ \t\r\n]*"[^"]*?"([ \t\r\n]*,[ \t\r\n]*.+?[ \t\r\n]*:[ \t\r\n]*"[^"]*?")*[ \t\r\n]*\)
捕获您想要的文本将很困难,因为您不知道要捕获多少文本,因此正则表达式不合适。尝试以下方法:
^\s*(?<FunctionName>[A-Za-z][A-Za-z_0-9]*)\(((?<parameter>[^:]*):"(?<value>[^"]+)",?\s*)*\)
^\s*(?[A-Za-z][A-Za-z\u 0-9]*)\((((?[^:]*):“(?[^”]+),?\s*)*\)
匹配函数名,^表示行的开头,因此字符串中的第一个字符必须匹配。如果不需要,可以保留删除空白捕获,我只是添加了它以使匹配更加灵活^\s*(?[A-Za-z][A-Za-z_0-9]*)
- 下一组
意味着捕获括号内的每个参数-值对。必须对函数的括号进行转义,因为它们是正则表达式语法中的符号\(((?[^:]*):“(?[^”]+”,?)*\)
^\s*(?<FunctionName>[A-Za-z][A-Za-z_0-9]*)\(((?<parameter>[^:]*):"(?<value>[^"]+)",?\s*)*\)
^\s*(?[A-Za-z][A-Za-z\u 0-9]*)\((((?[^:]*):“(?[^”]+),?\s*)*\)
匹配函数名,^表示行的开头,因此字符串中的第一个字符必须匹配。如果不需要,可以保留删除空白捕获,我只是添加了它以使匹配更加灵活^\s*(?[A-Za-z][A-Za-z_0-9]*)
- 下一组
意味着捕获括号内的每个参数-值对。必须对函数的括号进行转义,因为它们是正则表达式语法中的符号\(((?[^:]*):“(?[^”]+”,?)*\)
\w[\w\d]*\s*\(\s*(?:(\w[\w\d]*):("[^"]*"|\d+))*\s*\)
.此处:
\w[\w\d]*\s*\(\s*(?:(\w[\w\d]*):("[^"]*"|\d+))*\s*\)
.对于这样的问题,我总是建议人们不要“找到”一个正则表达式,而是编写多个正则表达式来共享工作 但这里是我的快速拍摄:
(?<funcName>[A-Za-z_][A-Za-z_0-9]*)
\(
(?<ParamGroup>
(?<paramName>[^(]+?)
:
"(?<paramValue>[^"]*)"
((,\s*)|(?=\)))
)*
\)
(?[A-Za-z_][A-Za-z_0-9]*)
\(
(?
(?[^(]+?)
:
"(?[^"]*)"
((,\s*)|(?=\))
)*
\)
空白是为了更好的可读性。删除它们或设置忽略模式空白的选项。对于这样的问题,我总是建议人们不要“查找”单个正则表达式,而是编写多个共享工作的正则表达式 但这里是我的快速拍摄:
(?<funcName>[A-Za-z_][A-Za-z_0-9]*)
\(
(?<ParamGroup>
(?<paramName>[^(]+?)
:
"(?<paramValue>[^"]*)"
((,\s*)|(?=\)))
)*
\)
(?[A-Za-z_][A-Za-z_0-9]*)
\(
(?
(?[^(]+?)
:
"(?[^"]*)"
((,\s*)|(?=\))
)*
\)
空白是为了更好的可读性。删除它们或设置忽略模式空白的选项。此正则表达式通过所有测试用例:
^(?<function>[A-Za-z][\w]*?)\(((?<param>[^:]*?):"(?<value>[^"]*?)",{0,1}\s*)*\)$
^(?[A-Za-z][\w]*?)\(((((?[^::*?):“(?[^”]*?),{0,1}\s*)*\)$
这适用于多个参数而不适用于任何参数。它还处理参数名称中的特殊字符和逗号后的空白。可能需要进行一些调整,因为您的测试用例没有涵盖文本中指示的所有内容
请注意,
\w
通常包含数字,不适合作为函数名的前导字符。参考:此正则表达式通过所有测试用例:
^(?<function>[A-Za-z][\w]*?)\(((?<param>[^:]*?):"(?<value>[^"]*?)",{0,1}\s*)*\)$
^(?[A-Za-z][\w]*?)\(((((?[^::*?):“(?[^”]*?),{0,1}\s*)*\)$
这适用于多个参数而不适用于任何参数。它还处理参数名称中的特殊字符和逗号后的空白。可能需要进行一些调整,因为您的测试用例没有涵盖文本中指示的所有内容
请注意,
\w
通常包含数字,不适合作为函数名的前导字符。参考:其他人已经给出了