Java 正则表达式排除不起作用的字符
我想从java文件中获取类名Java 正则表达式排除不起作用的字符,java,regex,Java,Regex,我想从java文件中获取类名 class Mango { 现在我想把mango作为类名 这是我用的正则表达式 \s*class\s+(\S+) 问题是,如果clasname在classname和结束的花括号之间没有空格,我得到的名称是mango{ 就像下面一个 class Mango{ 所以我想从组中排除{ \s*class\s+(\S+|[^{]) 但它不起作用,仍然用右括号捕获类名。我怎么才能只获取类名呢 要仅接受可用作类或变量名称的正确字符,我们可能需要使用方法,该方法可通过\p{
class Mango {
现在我想把mango
作为类名
这是我用的正则表达式
\s*class\s+(\S+)
问题是,如果clasname在classname和结束的花括号之间没有空格,我得到的名称是mango{
就像下面一个
class Mango{
所以我想从组中排除{
\s*class\s+(\S+|[^{])
但它不起作用,仍然用右括号捕获类名。我怎么才能只获取类名呢
要仅接受可用作类或变量名称的正确字符,我们可能需要使用方法,该方法可通过
\p{javaidentifierpart}
引用,如(强调部分):
通过相同的\p{property}
语法,可以使用类似java.lang.Character boolean isMethodName
方法(不推荐的方法除外)的类别,其中指定的属性的名称为javaMethodName
演示:
输出:Mango
如果您不打算在Java引擎中使用这个正则表达式,那么您可以使用[^\s{]
而不是像这样的\s
\s*class\s+([^\s{]+)
它将接受除空格以外的任何字符,并尝试使用此正则表达式:
class\s+([\w$]+)
\w
-是一个单词字符(a-zA-Z0-9)
此正则表达式将仅捕获类名中允许的字符。但是,如果我们假设编码器使用了有效字符,您也可以尝试:
(?<=class\s)\s*(.+?)(?=\s*\{)
(?不确定问题是什么:您想解释(a)为什么您的方法不起作用,还是想知道(b)这个问题的正确正则表达式是什么样的
如果是后者,其他的回答和评论提供了一些正确的表达,如果是前者,那么考虑什么是
(\S+|[^{])
实际上是匹配的。这基本上是说:匹配所有不是空白的或都不是左括号。注意句子中的“或”
表达式仍然与“Mango”后面的{
匹配的原因是它满足句子的第一部分:a{
不是空格,因此正则表达式匹配。相同的参数适用于“Mango”和{
之间的空格:它满足“不是左括号”部分,因此也是匹配的
您需要的是一个编码的表达式:匹配所有非空白的内容,不是左括号。如上所述,此问题的其他答案/注释显示了如何实现这一点的示例。更好的是匹配Java标识符规则的正则表达式,IIRC:class\s+([a-zA-Z]\uw*)
(标识符以字母或下划线字符开头,后跟零个或多个字母数字(或下划线)。(最好使用Unicode字符类:我记不起Java标识符是否可以使用ASCII以外的字符)“\w
的问题是它不会匹配所有可以在类名中使用的字符,比如$
@m.cekiera谢谢,但是(?@很抱歉,我犯了一个明显的错误,我假设名字后面总是有空格,我更新了答案你的意思是这样的吗??\s*class\s+([^\s{]++]
@whiletrue再次更新了答案,加入了\p{javaIdentifierPart}
,这似乎是Java正则表达式中处理这种情况的最佳工具。
(\S+|[^{])