正则表达式有效且无效的togather

时间:2017-03-05 07:42:48

标签: c++ regex

我想在下面的项目中只检测带有正则表达式的有效项目。 单词中的空格表示无效,#符号表示无效,带数字的起始单词无效。

Invalid : M_123 ASD
Invalid : M_123#ASD
Invalid : 1_M# ADD
Valid : M_125ASD
Valid : M_125$ASD

我正在尝试如下:

[A-Za-z0-9_$]

不能正常工作。我需要为单词设置有效和无效集。

我能和正则表达式匹配吗?

2 个答案:

答案 0 :(得分:1)

你的正则表达式[A-Za-z0-9_$]提供了一个字符类,它匹配一个ASCII字母或数字或_$符号的单个字符。如果您将其与std::regex_match一起使用,它只会匹配一个整个字符串,它只包含一个类似的字符,因为默认情况下该模式在与该方法一起使用时会被锚定。如果您将其与std::regex_search一起使用,则([_])之类的字符串会通过,因为正则表达式不是锚定并且可以找到部分匹配。< / p>

要匹配0个或更多个字符,您需要在课程后添加*个量词。要匹配一个或多个字符,您需要在字符类之后添加+量词。但是,您还有一个额外的限制:数字不能在开头出现。

好像你可以使用

^[A-Za-z][A-Za-z0-9_$]*$

请参阅regex demo at regex101.com

<强>详情:

  • ^ - 字符串开头
  • [A-Za-z] - 一个ASCII字母(恰好一次出现)
  • [A-Za-z0-9_$]* - 0 + ASCII字母,数字,_$
  • $ - 字符串锚定结束。

请注意,对于regex_match,您可以省略^$个锚点。

答案 1 :(得分:0)

所以要求是

  • 不能以数字开头(我假设它以字母开头)

  • 不能包含空格或#

  • 所有其他字符均有效

你可以试试这个正则表达式^[a-zA-Z]((?![\# ]).)+?$

^[a-zA-Z]检查行开头的字母 ((?![\# ]).)+?$会检查该行的剩余部分是否有#space

在线演示here

编辑

根据Wiktor的评论,正则表达式可以简化为^[a-zA-Z][^# ]+$