正则表达式排除一个不起作用的字符

时间:2015-08-03 12:53:42

标签: java regex

我想从java文件中获取类名。例如

class Mango {

现在我希望mango作为班级名称。

这是我使用的正则表达式

\s*class\s+(\S+)

它有效并且我捕获了类名。问题是如果clasname在classname和close花括号之间没有空格我的名字为mango{

如下所示。

class Mango{

所以我想从group.so中排除{我很想跟随

\s*class\s+(\S+|[^{])

但它不起作用,仍然使用右括号捕获classname。我怎么才能得到班级名称。

enter image description here

3 个答案:

答案 0 :(得分:4)

试试这个正则表达式:

class\s+([\w$]+)

\w - 是一个单词字符(a-zA-Z0-9 _)

此正则表达式仅捕获类名允许的字符。但是,如果我们假设编码器使用了有效字符,您也可以尝试:

(?<=class\s)\s*(.+?)(?=\s*\{)

DEMO

是:

  • (?<=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;部分,因此也匹配。

你想要的是一个编码的表达式:匹配不是空白的所有内容不是左大括号。如上所述,此问题的其他答案/评论显示了如何实现这一目标的示例。