7

我正在尝试遍历一些代码文件并找到不以分号结尾的行。

我目前有这个:^(?:(?!;).)*$来自一堆谷歌搜索,它工作得很好。但现在我想对其进行扩展,以便它忽略开头的所有空格或特定关键字,如包或打开和关闭大括号。

最终目标是采取这样的措施:

package example
{
    public class Example
    {
        var i = 0

        var j = 1;

        // other functions and stuff
    }
}

而要向我展示的模式var i = 0缺少一个分号。这只是一个例子,缺少的分号可能在课堂上的任何地方。

有任何想法吗?我已经摆弄了一个多小时,但没有运气。

谢谢。

4

6 回答 6

1

如果您想要一行不以分号结尾的行,您可以要求任何数量的任何内容.*,后跟一个不是分号的字符,然后在行尾[^;]可能跟一些空格。所以你有了:\s*$

.*[^;]\s*$

现在,如果您不想在开头使用空格,则需要询问行^首,后跟任何不是空格的字符,[^\s]然后是前面的正则表达式:

^[^\s].*[^;]\s*$

如果您不希望它以诸如packageor之类的关键字class或空格开头,您可以要求一个不属于这三件事中的任何一个的字符。匹配这三件事中的任何一个(?:\s|package|class)的正则表达式是,匹配除它们之外的任何东西的正则表达式是(?!\s|package|class)。注意!. 所以你现在有:

^(?!\s|package|class).*[^;]\s*$
于 2012-06-10T00:13:20.403 回答
1

在正则表达式中捕获这个复杂概念的关键是首先了解您的正则表达式引擎/解释器如何处理以下概念:

  1. 积极前瞻
  2. 负前瞻
  3. 积极的回顾
  4. 消极回顾

然后你可以开始理解如何捕捉你想要的东西,但只有在前面和后面的东西完全符合你指定的情况下。

str.scan(/^\s*(?=\S)(?!package.+\n|public.+\n|\/\/|\{|\})(.+)(?<!;)\s*$/)
于 2012-06-10T00:51:50.793 回答
1

试试这个:

^\s*(?!package|public|class|//|[{}]).*(?<!;\s*)$

在 PowerShell 中测试时:

PS> (gc file.txt) -match '^\s*(?!package|public|class|//|[{}]).*(?<!;\s*)$'
        var i = 0 
PS> 
于 2012-06-10T13:33:12.720 回答
1

这是我用来突出显示不以分号结尾的 Java 代码行并且不是 Java 中不应该在末尾有分号的行之一的正则表达式行...使用 vim 的正则表达式引擎。

\(.\+[^; ]$\)\(^.*public.*\|.*//.*\|.*interface.*\|.*for.*\|.*class.*\|.*try.*\|^\s*if\s\+.*\|.*private.*\|.*new.*\|.*else.*\|.*while.*\|.*protected.*$\)\@<!
   ^          ^                                                                                                                                           ^
   |          |                                                                                                                 negative lookbehind feature 
   |          |
   |          2.  But not where such matches are preceeded by these keywords
   |
   |
   1. Group of at least some anychar preceeding a missing semicolon

破译字形的助记符:

^          beginning of line
.*         Any amount of any char
+          at least one
[^ ... ]   everything but
$          end of line
\( ... \)  group
\|         delimiter
\@<!       negative lookbehind

大致翻译为:

找到所有不以分号结尾且左侧没有上述任何关键字/表达式的行。它并不完美,可能无法支持混淆的 java,但对于简单的 java 程序,它会突出显示末尾应该有分号的行,但不要。

显示此表达式如何为我工作的图像:

在此处输入图像描述

帮助我获得所需概念的有用链接:

https://jbodah.github.io/blog/2016/11/01/positivenegative-lookaheadlookbehind-vim/

于 2017-10-20T06:09:32.563 回答
0

对于不以分号结尾的行,这更简单:

.*[^;]$

如果您不希望以空格开头并以分号结尾的行:

^[^ ].*[^;]$
于 2012-06-10T00:10:24.393 回答
0

您正在尝试匹配可能以 whitespace 开头的行^\s*,然后没有特定的单词集,例如(?!package|class),然后有任何内容.*但不以分号(或后面有空格的分号)结尾[^;]\s*

^\s*(?!package|class).*?[^;]\s*$

请注意,我在正则表达式的一部分周围添加了括号。

于 2012-06-10T00:43:15.307 回答