正则表达头痛

Wel*_*.59 6 .net regex

我想为脚本引擎验证一些C#源代码.我想确保只能引用System.Math类成员.我正在尝试创建一个正则表达式,它将匹配一个点,后跟一个大写字母,后跟任意数量的单词字符,以一个不在System.Math之前的单词边界结束.

我从这开始:

(?<!Math)\.[A-Z]+[\w]*
Run Code Online (Sandbox Code Playgroud)

哪个适用于:

return Math.Max(466.89/83.449 * 5.5);  // won’t flag this
return Xath.Max(466.89/83.449 * 5.5);  // will flag this
Run Code Online (Sandbox Code Playgroud)

它在没有Math之前正确匹配.Max.但是,现在我正在尝试将正则表达式扩展为包含System,我无法让它工作.

我已经尝试了正则表达式的这些排列以及更多:

((?<!System\.Math)\.[A-Z]+[\w]*)
((?<!(?<!System)\.Math)\.[A-Z]+[\w]*)
((?<!System)\.(?<!Math)\.[A-Z]+[\w]*)
((?<!System)|(?<!Math)\.[A-Z]+[\w]*)
((?<!System\.Math)|(?<!Math)\.[A-Z]+[\w]*)
Run Code Online (Sandbox Code Playgroud)

使用这些陈述:

return System.Math.Max(466.89/83.449 * 5.5);
return System.Xath.Max(466.89/83.449 * 5.5);
return Xystem.Math.Max(466.89/83.449 * 5.5);
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有我能想到的东西,但它总是匹配第二个元素(上面的.Math或.Xath),或者它与任何东西都不匹配.

如果有人会怜悯我并指出我做错了什么,我会非常感激.

先谢谢,韦尔顿

Ala*_*ore 2

诀窍是确保您永远不会在除了开头之外的任何地方开始匹配成员名称。然后,使用前瞻来查明您正在查看的内容是否以 开头,这是一个简单的问题System.Math.。试试这个正则表达式:

(?<![\w.])(?!(?:System\.)?Math\.)(?:[A-Z]\w*\.)+[A-Z]\w*\b
Run Code Online (Sandbox Code Playgroud)

向后查找可确保匹配不会从单词 ( ) 中间\w或限定成员名称 ( ) 中间开始.。现在,如果先行失败,它不能直接跳转到下一个组件的开头(例如, in Math.System.Math.并重试。要么全有,要么全无。

但是,如果前面没有 ,则它将匹配。您真的需要它,还是这只是开发全名正则表达式的中间步骤?Math.MaxSystem.

编辑:我继续将该System.部分设为可选。