我正在尝试运行一些代码文件并查找不以分号结尾的行。
我目前拥有这个:来自一堆谷歌搜索的^(?:(?!;).)*$
,它的工作正常。但现在我想扩展它,所以它忽略了一开始的所有空格或特定的关键字,如包或打开和关闭括号。
最终目标是采取以下措施:
package example
{
public class Example
{
var i = 0
var j = 1;
// other functions and stuff
}
}
对于显示我var i = 0
的模式缺少一个半冒号。这只是一个例子,缺少的半冒号可以在课堂上的任何地方。
有什么想法吗?我已经摆弄了一个多小时,但没有运气。
感谢。
答案 0 :(得分:1)
如果你想要一个不以分号结尾的行,你可以要求任何数量.*
后跟一个不是分号[^;]
的字符,后面可能是一些空格{{} 1}}在行\s*
的末尾。所以你有:
$
现在,如果您不想在开头使用空格,则需要请求行.*[^;]\s*$
的开头,后跟任何不是空格^
的字符,后跟前面的正则表达式:
[^\s]
如果您不希望它以^[^\s].*[^;]\s*$
之类的关键字开头,或者说,package
或空格,您可以要求提供不属于这三种内容的字符。匹配这三个内容中的任何一个的正则表达式是class
,除了它们之外的任何匹配的正则表达式都是(?:\s|package|class)
。请注意(?!\s|package|class)
。所以你现在有:
!
答案 1 :(得分:1)
在正则表达式中捕获这个复杂概念的关键是首先要了解正则表达式引擎/解释器如何处理以下概念:
然后你就可以开始了解如何捕获你想要的东西,但只有在这样的情况下,前方的东西和后面的东西正如你指定的那样。
str.scan(/^\s*(?=\S)(?!package.+\n|public.+\n|\/\/|\{|\})(.+)(?<!;)\s*$/)
答案 2 :(得分:1)
试试这个:
^\s*(?!package|public|class|//|[{}]).*(?<!;\s*)$
在PowerShell中测试时:
PS> (gc file.txt) -match '^\s*(?!package|public|class|//|[{}]).*(?<!;\s*)$'
var i = 0
PS>
答案 3 :(得分:0)
对于不以分号结尾的行,这更简单:
.*[^;]$
如果您不希望以空格开头并以分号结尾的行:
^[^ ].*[^;]$
答案 4 :(得分:0)
您正在尝试匹配可能以空白^\s*
开头的行,然后没有特定的单词集,例如(?!package|class)
,然后有任何.*
但是然后不要以分号结尾(或以分号后面带有空格)[^;]\s*
。
^\s*(?!package|class).*?[^;]\s*$
请注意,我在正则表达式的一部分周围添加了括号。
答案 5 :(得分:0)
这是我用来突出显示不以分号结尾的Java代码行的正则表达式行,并且不是java中不应该使用的行之一最后有一个分号...使用vim的正则表达式引擎。
documentAdapter = new DocumentAdapter(act.getContext(), documentsList, Document.DOCUMENT_TYPE.ACT);
documentAdapter.notifyDataSetChanged();
解密字形的助记符:
\(.\+[^; ]$\)\(^.*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
大致翻译为:
找到所有不以分号结尾的行,并且不要在其左侧使用上述任何关键字/表达式。它并不完美,可能并不适用于混淆的java,但对于简单的java程序,它突出了最后应该有分号的行,但不是。
图片展示了这个表达式对我的影响:
帮助我获得所需概念的有用链接:
https://jbodah.github.io/blog/2016/11/01/positivenegative-lookaheadlookbehind-vim/