Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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#_Regex - Fatal编程技术网

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
似乎只是一个引用列表,而这些列表并没有应用于正则表达式。这完全是误导。