Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可能是一个简单的正则表达式_C#_.net_Regex - Fatal编程技术网

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]*)
    匹配函数名,^表示行的开头,因此字符串中的第一个字符必须匹配。如果不需要,可以保留删除空白捕获,我只是添加了它以使匹配更加灵活
  • 下一组
    \(((?[^:]*):“(?[^”]+”,?)*\)
    意味着捕获括号内的每个参数-值对。必须对函数的括号进行转义,因为它们是正则表达式语法中的符号
括号内的?是命名的捕获组,当.NET中的库支持它时,可以更轻松地捕获匹配中的组。

尝试以下方法:

^\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]*)
    匹配函数名,^表示行的开头,因此字符串中的第一个字符必须匹配。如果不需要,可以保留删除空白捕获,我只是添加了它以使匹配更加灵活
  • 下一组
    \(((?[^:]*):“(?[^”]+”,?)*\)
    意味着捕获括号内的每个参数-值对。必须对函数的括号进行转义,因为它们是正则表达式语法中的符号
括号内的?是命名的捕获组,在.NET中,当库支持它们时,可以更轻松地捕获匹配中的组。

此处:

\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
通常包含数字,不适合作为函数名的前导字符。参考:

其他人已经给出了