Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式排除不起作用的字符_Java_Regex - Fatal编程技术网

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

Java 正则表达式排除不起作用的字符,java,regex,Java,Regex,我想从java文件中获取类名 class Mango { 现在我想把mango作为类名 这是我用的正则表达式 \s*class\s+(\S+) 问题是,如果clasname在classname和结束的花括号之间没有空格,我得到的名称是mango{ 就像下面一个 class Mango{ 所以我想从组中排除{ \s*class\s+(\S+|[^{]) 但它不起作用,仍然用右括号捕获类名。我怎么才能只获取类名呢 要仅接受可用作类或变量名称的正确字符,我们可能需要使用方法,该方法可通过\p{

我想从java文件中获取类名

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+|[^{])