0

我需要编写一个正则表达式来确保变量是常量,给定如下输入:

const size N = 1;
const size MAX = 1;
int const stant = 1147;
int x = 4;

这是我创建的表达式:

const\s.*(\]|\s|\*)VARIABLETOCHECK(\(|\[|=|\s|;)

表达式说明:

  • \s- 空格后“const”。
  • .*- 任意数量的任意符号。
  • (\]|\s|\*)- 应该放在变量之前的符号。
  • VARIABLETOCHECK是我设置要检查的变量名的地方。
  • (\(|\[|=|\s|;)- 应该在变量之后的符号

问题:

问题是如果单词后面只有一个空格,const我的表达就不起作用。

而且每个变量 ( N, MAX, stant) 应该单独匹配:

const\s.*(\]|\s|\*)N(\(|\[|=|\s|;)

这应该只选择字符串:const size N = 1;

4

5 回答 5

1

如果我正确理解您的问题,您的目标是确保条目是恒定的。

输入:文本行

预期输出:如果是常量则为 True,否则为 False


正则表达式:

为此,我建议使用以下正则表达式:

^.*?const\s+(\w+\s+)?(\w)\s+=.*$

解释:

^线的开始

.*?任何字符都匹配并且其非贪婪

const关键词

\s+至少一个空格

(\w+\s+)?不是变量名的可选词。

(\w)Word 是变量名。

\s+可选空格

=等于文字值

.*任何字符

$行结束

此外,正则表达式中的第二组将为您提供变量名称,以防您想使用预定义的名称列表进行验证。


上述正则表达式的结果:

const size N = 1;==>

const size MAX = 1;==>

int const stant = 1147; ==>

int x = 4; ==>错误

或者,您可以通过在 matcher 中获取第二组来获取变量名称。

我不会对 VARIABLETOCHECK 进行硬编码,并且在大多数情况下硬编码是一种不好的做法。

于 2012-06-28T13:19:40.723 回答
1

使用正则表达式:

\bconst\b\s*(?:.*\b)?(VARIABLETOCHECK\b[^=]*?)\s*\=\s*(.*?)\s*[,;]

请参阅此处的测试代码。如果它验证“const”语法,它会返回变量名及其值。

于 2012-06-28T12:34:28.130 回答
0

我走错路了。

解决方法是下一个: 1. 下载 Doxygen 2. 生成 xml 格式的报告 3. 从 xml 中获取全局变量

谢谢你们!

于 2012-06-28T17:52:34.147 回答
0

这很尴尬,并且仅适用于该语言中的少数测试用例。编写一个解析方式与 c# 相同的正则表达式非常困难。但是,让我们用你所拥有的。

你写“应该在变量之前的符号”,但你的意思是“可以在变量之前的符号”,对吗?所以你需要*事后说这些字符可能会或可能不会出现:

const\s.*(\]|\s|\*)*VARIABLETOCHECK(\(|\[|=|\s|;)

现在,你有.*你的变量,这意味着任何字符串,真的。您可能应该排除;并且=至少通过使用

const\s[^;=]*(\]|\s|\*)*VARIABLETOCHECK(\(|\[|=|\s|;)
于 2012-06-28T12:35:53.217 回答
0

以下正则表达式将识别所有常量(整数、小数...)

digit [0-9]
digits {digit}+
constant {digits}(.{digits})?((e|E)[+|-]?{digits})?

PS:这是针对 lex

于 2022-02-01T05:45:10.327 回答