我有以下字符串变量:
String text = "
Lots of text...
some random text here
PackageName=com.company.package
more random text here";
我认为在这里检索我的包名的Java代码是:
Pattern pattern = Pattern.compile("PackageName=(.*)");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
String packageName = matcher.group(1);
}
不幸的是,matcher.find()总是返回false。我做错了什么?
请注意,我不尝试检索我的类的包名称,我不是要解析java属性文件。我试图解析一些文本,如上所述,在我需要检索的文本中的某处有一个param = value对。谢谢。
答案 0 :(得分:1)
我认为您的问题可能位于顶部的String
行。您不能在Java中多行声明String
字面值,您需要将它们分隔为\n
个字符:
String text = "Lots of text...\nString=Value\nPackageName=com.company.package\nString=Value";
为了使其更具可读性,您可以这样做:
String text = "Lots of text...\n"
+ "String=Value\n"
+ "PackageName=com.company.package\n"
+ "String=Value";
一旦做出更改,您提供的代码在JDK6上就可以正常使用。
那就是说,这里的正则表达式略有改进:
Pattern pattern = Pattern.compile("PackageName\\s*=\\s*(.*)");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
String packageName = matcher.group(1);
}
我做的唯一更改是添加\\s*
:这意味着任何空格(或没有),这样您就可以放置PackageName = abc
并让它工作(注意正则表达式项本身实际上是{{1}但是你必须在Java中转义\s*
字符。
答案 1 :(得分:0)
对于您提供的输入:
String text =“LOT of text ...”+“\ n”+“String = Value”+“\ n”+“PackageName = com.company.package”+“\ n”+“String = Value “;
你写的代码:
Pattern pattern = Pattern.compile("PackageName=(.*)");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
String packageName = matcher.group(1);
System.out.println(packageName);
}
工作正常,它会检索包名称。
除非您有任何要添加的内容以澄清问题,以及出现了什么问题,否则这甚至都不是问题,一切正常。 :)
干杯,尤金。
答案 2 :(得分:-2)
我的java代码
String text = "Lots of text... String=Value PackageName=com.company.package String=Value";
Pattern pattern = Pattern.compile("PackageName=(.*)");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
String packageName = matcher.group(1);
System.out.println(packageName);
}
结果运行:
com.company.package String = Value