嗨,我对正则表达式很新,但想构建一些与“Public”一词相匹配的东西“私人”| “受保护”和下面的单词(以获取以下单词),除非以下单词不是:void,string,int,bool。粗体字匹配可以是任何单词,除了上面列出的单词。
样本匹配:
示例不匹配:
我得到了这个,但它并没有真正起作用:
^((Public)|(Private)|(Protected)).*$(?<!Void|string|int)
答案 0 :(得分:4)
试试这个:
\b(?:public|private|protected)\s+(?!void|string|int|bool)(\w+)\s+
分词后,匹配(但不捕捉)public
或private
或protected
,然后是一个或多个空白字符,然后是一个或多个“字词“字符只要该字词不是void
或string
或int
或bool
。
似乎在我的测试中工作。
修改强>
要排除以get;
或set;
结尾的匹配项,它会有点复杂,但这似乎有效:
\b(?:public|private|protected)\s+(?!void|string|int|bool)(\w+)\s+((?!(get;|set;)$).)*$
我喜欢第一个添加后跟任意数字的任何字符,后面没有get;
或set;
结束行
这将匹配Public xyz Functionname get; with other stuff
但不匹配Public xyz Functionname get;
。如果前者也应该被排除,只需将第二个放到上一个$
,然后如果在第一个部分之后的任何地方有get;
或set;
,则会丢弃匹配。
答案 1 :(得分:0)
这就是你需要的:
^(Public|Private|Protected) (?!void|string|int).*$
答案 2 :(得分:0)
您的问题似乎与您的示例无关,但这与示例匹配:
^(Public|Private|Protected)\s+(?!void|string|int|bool)(\w+)\s+(\w+)
基本上,您希望使用 lookahead ,而不是 lookbehind 。 Lookbehinds并不像大多数人期望的那样有用。事实上,大多数正则表达式都会将你的 lookbehind视为语法错误。
答案 3 :(得分:0)
之前的答案没有正确使用字边界,并且会因以下原因而失败:
foopublic abc (FactorMystic's regex)
Public voidxyz Functionname (Alan Moore's regex)
在大多数编程语言中,包含带有附加字符的保留字的变量标识符仍然有效。例如,如果function
是保留字,则myfunction
的变量标识符仍然有效。
以下是修订后的正则表达式:
\b(Public|Private|Protected)\s+(?!(?:void|string|int|bool)\b)(\w+)
如果您使用它进行语法突出显示,我建议您编写一个实际的解析器。基于正则表达式的语法高亮显示器可能不准确,并且在处理嵌套构造时,大多数正则表达式都不是特别好。