Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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正则表达式_Java_Regex - Fatal编程技术网

匹配有效Java标识符的Java正则表达式

匹配有效Java标识符的Java正则表达式,java,regex,Java,Regex,我需要创建一个正则表达式,能够在Java代码中找到并获取有效标识符,如下所示: inta、b、c; 浮动d,e; a=b=5; c=6; 如果(a>b) { c=a-b; e=d-2.0; } 其他的 { d=e+6.0; b=a+c; } 我曾尝试在一个正则表达式中添加多个正则表达式,但如何构建一个模式来排除保留字 我尝试了这个正则表达式(&&&&&&&&&&&&&&&&&&&)&(&&&&&&)&([-+={1,2})&([.!?)}{;(-))((-)(否则| if | float |

我需要创建一个正则表达式,能够在Java代码中找到并获取有效标识符,如下所示:

inta、b、c;
浮动d,e;
a=b=5;
c=6;
如果(a>b)
{
c=a-b;
e=d-2.0;
}
其他的
{
d=e+6.0;
b=a+c;
}
我曾尝试在一个正则表达式中添加多个正则表达式,但如何构建一个模式来排除保留字

我尝试了这个正则表达式(&&&&&&&&&&&&&&&&&&&)&(&&&&&&)&([-+={1,2})&([.!?)}{;(-))((-)(否则| if | float | int)(\d[\d]),但它没有按预期工作

在下图中,我应该如何匹配标识符


Java有效标识符是:

  • 至少有一个字符的
  • 第一个字符必须是字母、下划线或美元符号
  • 其余字符可以是字母、数字、下划线或美元符号
  • 保留字不得用作标识符
  • 更新:因为单下划线
    \uu
    是一个关键字
  • 验证前三个条件的简单regexp如下:
    (\b([A-Za-z\u$][$\ w]*)\b)
    ,但它不会过滤掉保留字

    要排除保留字,需要负前瞻
    (?!)
    来指定一组不匹配的标记:
    \b(?)([A-Za-z$][$\w]*)

    • 第1组:
      (?!(b | if | else | for | float | int))
      排除指定单词的列表
    • 第2组:
      ([A-Za-z$][$\w]*)
      匹配标识符
    但是,单词border
    \b
    使用美元符号
    $
    ,因此此正则表达式无法匹配以
    $
    开头的标识
    此外,我们可能希望排除字符串和字符文本内部的匹配(“not_a_variable”、'c'、'\u65')


    这可以使用正向查找
    (?我认为Java允许Unicode字符作为标识符的一部分,即'Jävä'将是一个有效的标识符?@knittl是的,但是这个问题最初是关于尝试检测通常的基于ASCII的标识符。另外,因为代码将变成维护的噩梦。
    
    ID pattern:
    (?<=[^$\w'"\\])(?!(abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|double|do|else|enum|extends|false|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|transient|true|try|void|volatile|while|_\b))([A-Za-z_$][$\w]*)
    
    Identifiers in the following code:
    =====
    public class Main {
        static int $1;
        protected char _c0 = '\u65';
        private long c1__$$;
    }
    =====
    Main
    $1
    _c0
    c1__$$