C#Regex命令行参数解析,在参数名称中使用单连字符包装

本文关键字:参数 连字符 包装 命令行 C#Regex | 更新日期: 2024-10-24 06:18:26

我正在为.NET开发一个opensource/libre命令行解析器,它将是限制性的,但很清晰。起初,这似乎是一项简单的任务,但在两天的时间里,由于正则表达式问题而陷入困境,这并不那么有趣。:(

我已经读了几个小时关于单词匹配和分组的教程,但它并没有像我预期的那样起作用。当某个东西突然起作用,而我正试图为模式添加一个新功能时,有时以前起作用的一切都会失败。

因此,基本上我想构建四种不同的正则表达式模式,它们可以用于多种目的:

  • 分析在控制台中键入的用户参数列表
  • 检查程序员定义的参数名称是否匹配标准

每个匹配模式都允许一类特定的参数,如下所述:

1.单连字符前缀选项

一个连字符后面必须跟一个小写/大写字母数字,或者可以对多个开关进行分组。

例如,有效格式:

-A
-g
-1
-Ag1

后者等同于组合在一起的前3个选项。下面的模式适用于单字母,但不幸的是,它使用单连字符换行从其他参数中提取了一些片段。

-{1}'b[A-Za-z0-9]{1}'b

2.双连字符前缀选项

双连字符后面必须至少跟一个小写字母,后面必须跟多个小写字母数字,单词可以用一个连字符包装。

例如,有效格式:

--valid
--th1s-is-also-val1d
--match-this-option-as-well

无效格式:

--9this-is-invalid-because-of-the-leading-digit
--this--is--invalid--because--of--word--wrapping--by--multiple--hyphens
--this-should-also-fail-because-of-the-trailing-hyphen-

这些是我针对此任务的最新破碎模式。它们也与一些无效的匹配:

-{2}'b[a-z][a-z0-9-]{2,}'b
-{2}'b[a-z][a-z'd]{2,}'b(-{1}[a-z'd]+)*

3.价值观

必须跟在双连字符选项后面,并在它们之间插入一个等式符号。只有数值可以省略双引号。

4.内部命令

必须以小写字母开头,后面必须跟着多个小写字母数字,单词可以用一个连字符包装。除了不需要双连字符前缀外,基本上与#2中描述的规则相同。

直到前两个问题得到解决,我才想出任何对最后两个问题有用的办法。

顺便说一句,我使用的是Monosdevelop内置的Regex工具包,它使用Mono库。这也可能是个问题吗?

这是我的测试输入,包含以上所有样本:

-A -g -1 -Ag1 --valid --th1s-is-also-val1d --match-this-option-as-well --9this-is-invalid-because-of-the-leading-digit --this--is--invalid--because--of--word--wrapping--by--multiple--hyphens --this-should-also-fail-because-of-the-trailing-hyphen- --load-file="ReAdMe2.TxT"

有人能检查一下我的部分工作模式吗?它们出了什么问题?

非常感谢您提前提供的帮助。

C#Regex命令行参数解析,在参数名称中使用单连字符包装

您只需要在第二个正则表达式中添加开始和结束锚点。

^-{2}'b[a-z][a-z'd]{2,}'b(-[a-z'd]+)*$

演示

使用环视。

(?<!'S)-{2}'b[a-z][a-z'd]{2,}'b(-{1}[a-z'd]+)*(?!'S)

(?<!'S)否定查找,它断言匹配前面不会有非空格字符。

演示