C# 如何匹配逗号分隔列表并以不同字符结尾
我目前正在从事的一个项目涉及用C#编写解析器 我选择使用正则表达式来提取每行的部分。只有一个问题。。。我几乎没有什么正则表达式的经验 我目前的问题是,我无法让参数列表工作。更具体地说,我无法匹配逗号分隔的列表。在被困了两个小时之后,我已经开始这样做了 到目前为止,我最接近的正则表达式是:C# 如何匹配逗号分隔列表并以不同字符结尾,c#,regex,C#,Regex,我目前正在从事的一个项目涉及用C#编写解析器 我选择使用正则表达式来提取每行的部分。只有一个问题。。。我几乎没有什么正则表达式的经验 我目前的问题是,我无法让参数列表工作。更具体地说,我无法匹配逗号分隔的列表。在被困了两个小时之后,我已经开始这样做了 到目前为止,我最接近的正则表达式是: (?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+\s*)*\) 显然,实际代码部分不匹配。只需
(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+\s*)*\)
显然,实际代码部分不匹配。只需要列出的类型
我删除了所有的逗号检测代码,因为它都坏了
我想让它匹配void FunctionName(int a,string b)
或其他间距的等效值
我怎样才能做到这一点
请在投票关闭前建议编辑,我不擅长堆栈溢出。您实际上非常接近:
(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+,?\s*)*\)
唯一的区别是靠近正则表达式末尾的,?
,这意味着一个可选的逗号,它将匹配变量之间的逗号。尝试如下操作:
(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+(?(?=\s*,\s*\w)\s*,\s*|\s*))*\)
说明:
- 这里的关键部分是if-else正则表达式a la
:(?(?=regex)then | else)
(?(?=\s*,\s*\w)\s*,\s*|\s*)
这意味着:如果类型参数对后跟逗号断言,则会出现另一个单词字符
然而,如果你觉得使用正则表达式对于你手头的任务来说可能是错误的选择。现在有一些轻量级的解析器框架,例如..我尝试了这个,问题是它与
,)
匹配,这是我希望避免的。