Java 我如何编写一个符合理想模式而不符合其他模式的正则表达式?
我正在编写一个简化的Java编译器。我为变量名编写了一个正则表达式: “(?[a-zA-Z]+[\w]*)” 我想补充一点,名字不能是某些单词,比如int,double,true,falseJava 我如何编写一个符合理想模式而不符合其他模式的正则表达式?,java,regex,Java,Regex,我正在编写一个简化的Java编译器。我为变量名编写了一个正则表达式: “(?[a-zA-Z]+[\w]*)” 我想补充一点,名字不能是某些单词,比如int,double,true,false 我试着用^,但它不起作用。我不认为这应该通过正则表达式来实现,而是可以更好地使用哈希集来实现,并排除该集中包含的标识符名称。我不认为这应该通过正则表达式实现,而是可以更好地使用哈希集来实现排除集合中包含的标识符名称。这可以通过RE完成,但人类编写它并不容易。在扫描程序中将关键字视为标识符,然后在标记器中将标
我试着用^,但它不起作用。我不认为这应该通过正则表达式来实现,而是可以更好地使用
哈希集来实现,并排除该集中包含的标识符名称。我不认为这应该通过正则表达式实现,而是可以更好地使用哈希集来实现排除集合中包含的标识符名称。这可以通过RE完成,但人类编写它并不容易。在扫描程序中将关键字视为标识符,然后在标记器中将标识符与关键字区分开来。这应该要简单得多。这可以用RE来完成,但人类编写它并不容易。在扫描程序中将关键字视为标识符,然后在标记器中将标识符与关键字区分开来。这应该更简单。^用于其他用途:
^可能出现在模式的开头,以要求匹配
发生在一行的最开头。例如,^abc匹配
abc123,但不是123abc
考虑使用“(?!…)”:
(?!…)是消极的前瞻,因为它要求
指定的模式不存在
我建议,如果这是不可能的或太难,去真正的编码代替。有时,正则表达式可能比实际的、优化的代码慢得多,它们可能会非常混乱,并且您可能很难找到所编写代码的错误
要试用正则表达式,请选中此项:
要快速引用,请选中此选项:
^用于其他用途:
^可能出现在模式的开头,以要求匹配
发生在一行的最开头。例如,^abc匹配
abc123,但不是123abc
考虑使用“(?!…)”:
(?!…)是消极的前瞻,因为它要求
指定的模式不存在
我建议,如果这是不可能的或太难,去真正的编码代替。有时,正则表达式可能比实际的、优化的代码慢得多,它们可能会非常混乱,并且您可能很难找到所编写代码的错误
要试用正则表达式,请选中此项:
要快速引用,请选中此选项:
您想用什么语言编写Java编译器?如果这也是Java,为什么不使用Java自己的编译器呢?您想用什么语言编写Java编译器?如果这也是Java,为什么不使用Java自己的编译器呢?我想OP的意思是设置否定[^…]
,而不是BOL断言。作为补充说明,真正常规的、正确实现的REs不会比“优化”代码执行得慢。事实上,从RE生成的最小DFA是可以期望的最“优化”的代码,也可以参见例如:(以及第二部分和第三部分)当然,这取决于具体情况。请注意,与正则表达式相比,实代码具有更强的匹配规则的“能力”,而且与实代码一样,糟糕的正则表达式也会使检查非常缓慢。示例:正则表达式不应为此负责。相反,看起来java的实现被严重破坏了。这段代码在我的机器上执行需要22毫秒:我想OP意味着设置否定[^…]
而不是BOL断言。作为补充说明,真正常规的、正确实现的REs不会比“优化”代码执行得慢。事实上,从RE生成的最小DFA是可以期望的最“优化”的代码,也可以参见例如:(以及第二部分和第三部分)当然,这取决于具体情况。请注意,与正则表达式相比,实代码具有更强的匹配规则的“能力”,而且与实代码一样,糟糕的正则表达式也会使检查非常缓慢。示例:正则表达式不应为此负责。相反,看起来java的实现被严重破坏了。在我的机器上执行此代码需要22毫秒: