C# regex以字符集开始和结束,但两者之间的字符集不同

C# regex以字符集开始和结束,但两者之间的字符集不同,c#,.net,regex,C#,.net,Regex,我正在尝试创建一个正则表达式: 必须具有一组字符中的第一个字符(first\u set) 可以选择在不同的字符集中包含后续字符(SECOND\u set) 但是如果它有2个或更多字符,最后一个字符必须在第一个\u集中 总共不能超过MAX_CHARS个字符 范例 第一组=a-c或e-g(因此不包括d) SECOND\u SET=a-g 最大字符数=10 以下是我目前掌握的情况: ^[a-c|e-g][a-g]{0,8}[a-c|e-g]{0,1}$ 这似乎有效,除非d是最后一个字符,并且字

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

  • 必须具有一组字符中的第一个字符(
    first\u set
  • 可以选择在不同的字符集中包含后续字符(
    SECOND\u set
  • 但是如果它有2个或更多字符,最后一个字符必须在
    第一个\u集中
  • 总共不能超过
    MAX_CHARS
    个字符
范例

  • 第一组
    =a-c或e-g(因此不包括d)
  • SECOND\u SET
    =a-g
  • 最大字符数
    =10
以下是我目前掌握的情况:

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

这似乎有效,除非
d
是最后一个字符,并且字符总数

有办法解决这个问题吗?

您可以使用

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

详细信息

  • ^
    -字符串的开头
  • (?!.{11})
    -最多允许10个字符
  • (?=.*[a-ce-g]$)
    -在0个或更多字符之后,最后一个字符应来自
    第一组
  • [a-ce-g]
    -第一套
    中的字母
  • [a-g]{0,9}
    -第二组
    中的0到9个字符
  • $
    -字符串结束
请注意,
|
在字符类中匹配文字管道字符,您需要将其从模式中删除


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

这与不应该匹配的情况相匹配:
abcdabcdd
它以
d
结尾,最后一个字符必须在第一个字符集中<代码>d
不在第一个set@SFun28好的,修复了。这不适用于应该匹配的
a
。输入字符串可以选择在第一个字符串之后有后续字符,但根据我的帖子,它是可选的。我认为这是可行的:
^(?。{11})(?=.[a-ce-g]$)[a-ce-g][a-g]{0,9}$
(将
+
更改为
*
)@SFun28是的,首先用
*
替换
+
,我以为
在中,但如果它有2个或更多字符,则表示
第二组
,但似乎您指的是整个字符串,对吗?是的,我指的是整个字符串。抱歉搞混了!