我想从java文件中获取类名。例如
class Mango {
现在我希望mango
作为班级名称。
这是我使用的正则表达式
\s*class\s+(\S+)
它有效并且我捕获了类名。问题是如果clasname在classname和close花括号之间没有空格我的名字为mango{
如下所示。
class Mango{
所以我想从group.so中排除{
我很想跟随
\s*class\s+(\S+|[^{])
但它不起作用,仍然使用右括号捕获classname。我怎么才能得到班级名称。
答案 0 :(得分:4)
试试这个正则表达式:
class\s+([\w$]+)
\w
- 是一个单词字符(a-zA-Z0-9 _)
此正则表达式仅捕获类名允许的字符。但是,如果我们假设编码器使用了有效字符,您也可以尝试:
(?<=class\s)\s*(.+?)(?=\s*\{)
是:
(?<=class\s)
- 词类和空白的正面观察,\s*(.+?)
- 零个或多个空格,以及一个或多个字符(?=\s*\{)
- whitspace和大括号的正向前瞻
{
直接获取类名。这个正则表达式允许所有字符,但是如果编码器使用Java名称中允许的很少使用characters之一,那么它可能很有用。
答案 1 :(得分:3)
要仅接受可用作类或变量名称的正确字符,我们可能希望使用方法Character.isJavaIdentifierPart
,可以Pattern class documentation中的说明通过\p{javaJavaIdentifierPart}
引用方法{重点}矿):
行为类似于
java.lang.Character boolean isMethodName
方法的类别(已弃用的方法除外)可通过相同的\p{property}
语法获得,其中指定的property
具有名称javaMethodName
。< / p>
演示:
String text = "class Mango{";
Pattern p = Pattern.compile("\\s*class\\s+(\\p{javaJavaIdentifierPart}+)");
Matcher m = p.matcher(text);
if (m.find()){
System.out.println(m.group(1));
}else{
System.out.println("no match found");
}
输出:Mango
如果您不打算在Java引擎中使用此正则表达式,那么您可以使用[^\s{]
代替\S
\s*class\s+([^\s{]+)
它将接受除空格和{
之外的任何字符。
答案 2 :(得分:2)
不确定问题是什么:你想要解释(a)为什么你的方法不起作用或你想知道(b)这个问题的正确正则表达式是什么样的?
如果是后者,其他答案和评论提供了一些正确的表达方式。如果它是前者,那么考虑一下
(\S+|[^{])
实际上匹配。这基本上是说:匹配不是空白的所有内容或不是左大括号。注意&#34;或&#34;在那句话中。
你的表达式在&#34; Mango&#34;之后仍然与{
匹配的原因是它满足句子的第一部分:{
不是空格,所以你的正则表达式匹配。同样的论点适用于&#34; Mango&#34;之间的空间。和{
:它满足&#34;而不是左括号&#34;部分,因此也匹配。
你想要的是一个编码的表达式:匹配不是空白的所有内容和不是左大括号。如上所述,此问题的其他答案/评论显示了如何实现这一目标的示例。