C# 如何记录正则表达式本身?
我有一个正则表达式C# 如何记录正则表达式本身?,c#,regex,C#,Regex,我有一个正则表达式 (\/+[^\/\[\]]+(?:\[[^\]']*(?:'[^']*')\]]))+ 我已验证它是否匹配我的测试字符串 //SapButton[@automationId='tbar[0]/btn[15]] 由于无法立即理解正则表达式,我使用(?#)尝试了文档功能,因此我将正则表达式更改为 ((?#捕获类型名称的组) \/+(?#以/或/开头) [^\/\[\]+(?#类型名称,不包括属性开头和下一个类型) (?:(?#属性的非捕获组) \[(?#属性的开头) [^\]
(\/+[^\/\[\]]+(?:\[[^\]']*(?:'[^']*')\]]))+
我已验证它是否匹配我的测试字符串
//SapButton[@automationId='tbar[0]/btn[15]]
由于无法立即理解正则表达式,我使用(?#)尝试了文档功能,因此我将正则表达式更改为
((?#捕获类型名称的组)
\/+(?#以/或/开头)
[^\/\[\]+(?#类型名称,不包括属性开头和下一个类型)
(?:(?#属性的非捕获组)
\[(?#属性的开头)
[^\]']*(?#除属性结尾或字符串开头以外的任何内容)
(?:(?#字符串的非捕获组)
“(?#字符串开始)
[^']*(?#字符串内的任何内容,字符串末尾除外)
“(?#字符串结束)
)(?#字符串组末尾)
\](?#属性末尾)
)(?#属性可以出现0次或一次)
)+(?#类型可以出现一次或多次)
但是现在正则表达式不再匹配我的测试字符串。原因是新词。将正则表达式更改为
(?#类型名称的捕获组)\/+(?#以/或//)开头[^\/\[\]+(?#类型名称,不包括属性开头和下一个类型)(?:(?#属性的非捕获组)\[(?#属性开头)[^\]*(?#除属性结尾或字符串开头外的任何内容)(?:(?#字符串的非捕获组)(?#字符串开头)[^']*(?#字符串内的任何内容,字符串结束除外)(?#字符串结束))(?#字符串组结束)\](?#属性结束))(?#属性可以出现0次或一次)+(?#类型可以出现一次或多次)
行得通,但又不可读了
如何正确记录正则表达式本身?
请注意,我希望避免在C#方法的注释中这样做,因为当正则表达式被更改时,这有太多不被更新的可能性
依我看,最好是用一个逐字逐句的多行字符串来完成(当然,它仍然需要工作)。有
问题是,然后你必须用\
转义空格和\
。好消息是\
将开始一个注释,就像C中的/
一样#
您可以使用RegexOptions.IgnorePatternWhitespace
或regex开头的(?x)
激活它
(?x)
受支持。这并不是一个理想的解决方案,但您可以将记录在案的regexp存储在字符串中,在匹配之前,您可以替换字符串中的\r\n所有内容
然后,您的代码中将有一个可读的表示,并且在运行时有一个正确的regexp
我不知道还有什么办法,但你的表现值得称赞
这与Regex101中的x
选项有什么不同吗?显然是的。在C#works中使用IgnorePatternWhitespace
。我非常依赖Regex101。@Thomas我刚刚在Regex101中测试了(?x)
,它工作正常(甚至在C#中也可以使用它)是的,gmixXsuUAJ
似乎只是一个引用列表,而这些列表并没有应用于正则表达式。这完全是误导。