【问题标题】:Regex Forward and Backward looking patterns正则表达式向前和向后看模式
【发布时间】:2011-09-11 02:45:22
【问题描述】:

您好,我对正则表达式非常陌生,但想构建一些与“公共”一词匹配的东西 | “私人” | "Protected" 和后面的单词(抓取后面的单词),除非后面的单词不是:void、string、int、bool。加粗的单词匹配可以是除上面列出的单词之外的任何单词。

示例匹配:

  • 公共 xyz 函数名(匹配)
  • 公共 abc 函数名(匹配)
  • 私有 rbc 函数名(匹配)
  • 受保护的 klm 函数名(匹配)

示例不匹配:

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

我已经做到了,但它并没有真正正常工作:

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

【问题讨论】:

  • 什么风格的正则表达式? perl 正则表达式和 javascript 正则表达式是天壤之别。

标签: regex


【解决方案1】:

试试这个:

\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;,则匹配将被丢弃。

【讨论】:

  • 不幸的是,以下代码将失败:foopublic abc。请参阅下面我的答案以获取修改后的正则表达式。
  • 感谢神秘因素。我将如何修改它以排除任何以以下结尾的行:get;放; ?
【解决方案2】:

这是你需要的:

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

【讨论】:

    【解决方案3】:

    您的问题似乎与您的示例不符,但这与示例相符:

    ^(Public|Private|Protected)\s+(?!void|string|int|bool)(\w+)\s+(\w+)
    

    基本上,您想使用lookahead,而不是lookbehind。 Lookbehinds 并不像大多数人期望的那样有用。事实上,大多数正则表达式风格都会将 your 后视视为语法错误。

    【讨论】:

      【解决方案4】:

      之前的答案没有正确利用单词边界,并且会因以下原因而失败:

      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+)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多