首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个可能简单的正则表达式

一个可能简单的正则表达式
EN

Stack Overflow用户
提问于 2010-09-08 05:00:17
回答 5查看 205关注 0票数 0

当涉及到regex时,我是一个完全的新手,我希望帮助在以下内容中匹配一个表达式:

代码语言:javascript
复制
 {ValidFunctionName}({parameter}:"{value}")

 {ValidFunctionName}({parameter}:"{value}",
                     {parameter}:"{value}")

 {ValidFunctionName}()

其中{x}是我想要匹配的参数,{$%}可以是任何值“$例如,{value}必须用引号括起来。

代码语言:javascript
复制
ThisIsValid_01(a:"40")

将是"ThisIsValid_01","a","40“

代码语言:javascript
复制
ThisIsValid_01(a:"40", b:"ZOO")

可以是"ThisIsValid_01","a","40","b","ZOO“

代码语言:javascript
复制
01_ThisIsntValid(a:"40")

不会退回任何东西

代码语言:javascript
复制
ThisIsntValid_02(a:40)

不会返回任何内容,因为40没有用引号括起来。

代码语言:javascript
复制
ThisIsValid_02()

将返回"ThisIsValid_02“

对于一个有效的函数名,我遇到了:"A-Za-z_*“,但我无论如何也想不出如何匹配其余的函数名。我一直在http://regexpal.com/上尝试让有效的匹配符合所有条件,但是没有用:(

如果你也友好地解释正则表达式,那就更好了,这样我就可以学习了:)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-08 06:57:50

其他人已经给出了一个简单的字符串列表,但是考虑到强类型和适当的类结构,我将提供一个正确封装数据的解决方案。

首先,声明两个类:

代码语言:javascript
复制
public class ParamValue         // For a parameter and its value
{
    public string Parameter;
    public string Value;
}
public class FunctionInfo       // For a whole function with all its parameters
{
    public string FunctionName;
    public List<ParamValue> Values;
}

然后执行匹配并填充FunctionInfo列表:

(顺便说一句,我对正则表达式做了一些小的修正...它现在将正确匹配标识符,并且不会将双引号作为每个参数的“value”的一部分。)

代码语言:javascript
复制
Regex r = new Regex(@"(?<function>[\p{L}_]\w*?)\((?<inner>.*?)\)");
Regex inner = new Regex(@",?(?<param>.+?):""(?<value>[^""]*?)""");
string input = "_test0(a:\"lolololol\",b:\"2\") _test1(ghgasghe:\"asjkdgh\")";

var matches = new List<FunctionInfo>();

if (r.IsMatch(input))
{
    MatchCollection mc = r.Matches(input);
    foreach (Match match in mc)
    {
        var l = new List<ParamValue>();

        foreach (Match m in inner.Matches(match.Groups["inner"].Value))
            l.Add(new ParamValue
            {
                Parameter = m.Groups["param"].Value,
                Value = m.Groups["value"].Value
            });

        matches.Add(new FunctionInfo
        {
            FunctionName = match.Groups["function"].Value,
            Values = l
        });
    }
}

然后,您可以使用像FunctionName这样的标识符很好地访问该集合

代码语言:javascript
复制
foreach (var match in matches)
{
    Console.WriteLine("{0}({1})", match.FunctionName,
        string.Join(", ", match.Values.Select(val =>
            string.Format("{0}: \"{1}\"", val.Parameter, val.Value))));
}
票数 1
EN

Stack Overflow用户

发布于 2010-09-08 05:14:05

试试这个:

代码语言:javascript
复制
^\s*(?<FunctionName>[A-Za-z][A-Za-z_0-9]*)\(((?<parameter>[^:]*):"(?<value>[^"]+)",?\s*)*\)

  • ^\s*(?<FunctionName>[A-Za-z][A-Za-z_0-9]*)与函数名匹配,^表示行首,因此字符串中的第一个字符必须匹配。如果您不需要空格捕获,您可以继续删除它,我添加它只是为了使匹配更加灵活。
  • 下一组\(((?<parameter>[^:]*):"(?<value>[^"]+)",?)*\)意味着捕获括号内的每个参数-值对。您必须对函数的括号进行转义,因为它们是regex语法中的符号。

在括号内的?<>被命名为capture groups,当库支持时,就像在.NET中一样,这使得抓取匹配中的组变得更容易。

票数 1
EN

Stack Overflow用户

发布于 2010-09-08 05:14:30

这里:

代码语言:javascript
复制
\w[\w\d]*\s*\(\s*(?:(\w[\w\d]*):("[^"]*"|\d+))*\s*\)

Visualization of that regex here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3662722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档