我想解析变量声明语句并获取变量名称.我正在做以下事情
String var = "private String ipaddress;";
Run Code Online (Sandbox Code Playgroud)
我正在使用下面的正则表达式匹配上面的字符串
.*private\\s+([a-z]*)\\s+([a-z0-9_]*);
Run Code Online (Sandbox Code Playgroud)
这是行不通的.它说找不到匹配任何人都可以帮忙.
Tho*_*mas 10
首先,从正则表达式的开头删除该点,因为它在private
匹配之前需要一个字符.
其次,你的正则表达式区分大小写,与大写字母不匹配.使用[a-zA-Z]
或使表达式不区分大小写((?i)
在IIRC开始时).
顺便说一句,[a-zA-Z0-9_]
会是一样的\w
.
另一件事:你的表达式也会捕获非法变量名称以及错过合法变量名称.变量不允许以数字开头,但也可以包含美元符号.因此,名称表达应该类似于([a-zA-Z_$][\w$]*)
第一个字符必须是字母,下划线或美元符号,后跟任意数量的单词字符或美元符号.
最后一点:根据您对这些声明的处理方式,请记住您可能需要检查这些保留字.例如,调整后的表达式仍然匹配"private String private"
.
另外最后一个音符:记住,有可能超过修饰private
的变量,例如public
,protected
,static
等-或者根本没有.
编辑:
现在您在第一个点后面有星号,这对于您的特殊情况应该不是问题.但是,点几乎匹配任何字符,因此也匹配fooprivate
.根据您要实现的目标,移除点或添加\s+
后.*
.
由于Java中变量的声明可以在变量名之前有更多3个单词,我建议你不要限制你的搜索并使用它:
String var = "private String ipaddress;";
//String var2 = "private static final int test=13;";
Pattern p = Pattern.compile(".+\\s(.+?)(;|=)");
Matcher m = p.matcher(var);
while(m.find()){
System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)
它将查找以空格开头并以";"结尾的任何变量名称 或"=".这是对变量名称的更一般搜索.
编辑这个实际上让我思考,因为这也是Java中的法律声明:
private
static
volatile
String
s , t1 = "";
Run Code Online (Sandbox Code Playgroud)
这实际上可以改进,因为它被认为/快速完成.
public static void main(String[] args) {
String var0 = "private static final int test,test2;";
String var1 = "private \n static \n final \n int \n testName \n =\n 5 \n";
String var2 = "private \n static \n final \n String \n testName \n =\n \" aaa = bbbb \" \n";
String var3 = "private \n static \n final \n String \n testName,testName2 \n =\n \" aaa = bbbb \" \n";
String var4 = "int i;";
String var5 = "String s ;";
String var6 = "final String test ; ";
String var7 = "public int go = 23;";
String var8 = "public static final int value,valu2 ; ";
String var9 = "public static final String t,t1,t2 = \"23\";";
String var10 = "public \n static \n final \n String s1,s2,s3 = \" aaa , bbb, fff, = hhh = , kkk \";";
String var11 = "String myString=\"25\"";
LinkedList<String> input = new LinkedList<String>();
input.add(var0);input.add(var1);input.add(var2);input.add(var3);input.add(var4);input.add(var5);
input.add(var6);input.add(var7);input.add(var8);input.add(var9);input.add(var10);
input.add(var11);
LinkedList<String> result = parametersNames(input);
for(String param: result){
System.out.println(param);
}
}
private static LinkedList<String> parametersNames(LinkedList<String> input){
LinkedList<String> result = new LinkedList<String>();
for(String var: input){
if(var.contains("\n")) var = var.replaceAll("\n", "");
var = var.trim();
if(var.contains("=")){
var = var.substring(0, var.indexOf("=")).trim() + "";
Pattern p = Pattern.compile(".+\\s(.+)$");
Matcher m = p.matcher(var);
if(m.find()){
if(m.group(1).contains(",")){
String [] tokens = m.group(1).split(",");
for(String token : tokens){
result.add(token);
}
} else{
result.add(m.group(1));
}
}
} else{
Pattern p = Pattern.compile(".+\\s(.+?)(;|=)");
Matcher m = p.matcher(var);
if(m.find()){
if(m.group(1).contains(",")){
String [] tokens = m.group(1).split(",");
for(String token : tokens){
result.add(token);
}
} else{
result.add(m.group(1));
}
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
.*private\\s+(\\w*)\\s+(\\w*);
使用这种模式。[az] 是小写字母,但文本中的“String”以大写字母开头S
。\\w
是一个单词字符。它就像[a-zA-Z0-9_]
你的文本看起来会像这样,"private <type> <field name>;"
如果是这样,你的类型可以包含大写小写字母、数字或下划线,所以写作\\w
是一个很好的解决方案。
归档时间: |
|
查看次数: |
10304 次 |
最近记录: |