正则表达式前向和后向模式

时间:2011-09-11 02:45:22

标签: regex

嗨,我对正则表达式很新,但想构建一些与“Public”一词相匹配的东西“私人”| “受保护”和下面的单词(以获取以下单词),除非以下单词不是:void,string,int,bool。粗体字匹配可以是任何单词,除了上面列出的单词。

样本匹配:

  • 公共xyz功能名称(匹配)
  • 公共abc功能名称(匹配)
  • 私人rbc功能名称(匹配)
  • 受保护的klm功能名称(匹配)

示例不匹配:

  • Public void Functionname(不匹配)
  • 公共字符串函数名称(不匹配)
  • Public int Functionname(不匹配)

我得到了这个,但它并没有真正起作用:

^((Public)|(Private)|(Protected)).*$(?<!Void|string|int)

4 个答案:

答案 0 :(得分:4)

试试这个:

\b(?:public|private|protected)\s+(?!void|string|int|bool)(\w+)\s+

分词后,匹配(但不捕捉)publicprivateprotected,然后是一个或多个空白字符,然后是一个或多个“字词“字符只要该字词不是voidstringintbool

似乎在我的测试中工作。

修改 要排除以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+)

如果您使用它进行语法突出显示,我建议您编写一个实际的解析器。基于正则表达式的语法高亮显示器可能不准确,并且在处理嵌套构造时,大多数正则表达式都不是特别好。