正则表达式以字符集开始和结束,但中间使用不同的字符集

时间:2019-03-07 16:52:12

标签: c# .net regex

我正在尝试创建一个正则表达式:

  • 它必须是一组字符(FIRST_SET)中的第一个字符
  • 可以选择在其他字符集中使用后续字符(SECOND_SET
  • 但如果它包含2个或更多字符,则最后一个字符必须在FIRST_SET
  • 总共不能超过MAX_CHARS个字符

示例

  • FIRST_SET = a-c或e-g(因此不包括d)
  • SECOND_SET = a-g
  • MAX_CHARS = 10

这是我到目前为止所拥有的:

^[a-c|e-g][a-g]{0,8}[a-c|e-g]{0,1}$

这似乎可行,除非d是最后一个字符,字符总数为< MAX_CHARS

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以使用

^(?!.{11})(?=.*[a-ce-g]$)[a-ce-g][a-g]{0,9}$

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?!.{11})-最多允许10个字符
  • (?=.*[a-ce-g]$)-0个或更多字符后,最后一个字符应来自FIRST SET
  • [a-ce-g]-FIRST SET的一封信
  • [a-g]{0,9}-SECOND SET中的零到九个字符
  • $-字符串的结尾。

请注意,字符类中的|与文字管道字符匹配,您需要将其从模式中删除。

(?!.{11})否定超前查询在字符串的开头执行一次,如果字符串中有11个字符(换行符除外),则匹配失败。您也可以使用(?=.{0,10}$),它将仅需要0到10个字符的字符串。