使用反向引用的字母顺序正则表达式

Jed*_*edi 6 regex backreference character-class

我最近遇到了一个难题,找到一个匹配的正则表达式:

5个字符长的字符串,由按字母顺序升序的小写英文字母组成

有效的例子包括:

aaaaa
abcde
xxyyz
ghost
chips
demos
Run Code Online (Sandbox Code Playgroud)

无效的示例包括:

abCde
xxyyzz
hgost
chps
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是kludgy.我使用正则表达式:

(?=^[a-z]{5}$)^(a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*)$
Run Code Online (Sandbox Code Playgroud)

它使用非消耗捕获组来断言字符串长度为5,然后验证该字符串是否按顺序包含小写英文字母(请参阅Rubular).

相反,我想在字符类中使用反向引用.就像是:

^([a-z])([\1-z])([\2-z])([\3-z])([\4-z])$
Run Code Online (Sandbox Code Playgroud)

我头脑中的解决方案(参见Rubular)的逻辑是捕获第一个字符[az],在第二个字符类中使用它作为backrefence,依此类推.然而\1,\2...字符类中似乎是指1,2,...,有效匹配任意四或五个字符的字符串的ASCII值.

我有两个问题:

  1. 我可以在我的角色类中使用反向引用来检查升序字符串吗?
  2. 对这个难题有什么不那么糟糕的解决方案吗?

Fed*_*zza 4

我将此答案发布为评论而不是答案,因为它的格式比评论更好。

与您的问题相关:

  1. 我可以在字符类中使用反向引用来检查升序字符串吗?

不,你不能。如果您查看backref 正则表达式部分,您将找到以下文档:

括号和反向引用不能在字符类内部使用

括号不能在字符类内部使用,至少不能用作元字符。当您将括号放入字符类中时,它将被视为文字字符。因此正则表达式 [(a)b] 匹配 a、b、( 和 )。

反向引用也不能在字符类内部使用。(a)[\1b] 等正则表达式中的 \1 要么是错误,要么是不必要的转义文字 1。在 JavaScript 中,它是八进制转义。

关于你的第二个问题:

  1. 对于这个难题,有没有更简单的解决方案?

恕我直言,你的正则表达式非常好,你可以在开始时将其缩短一点,如下所示:

(?=^.{5}$)^a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$
    ^--- Here
Run Code Online (Sandbox Code Playgroud)

正则表达式演示