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值.
我有两个问题:
我将此答案发布为评论而不是答案,因为它的格式比评论更好。
与您的问题相关:
- 我可以在字符类中使用反向引用来检查升序字符串吗?
不,你不能。如果您查看backref 正则表达式部分,您将找到以下文档:
括号和反向引用不能在字符类内部使用
括号不能在字符类内部使用,至少不能用作元字符。当您将括号放入字符类中时,它将被视为文字字符。因此正则表达式 [(a)b] 匹配 a、b、( 和 )。
反向引用也不能在字符类内部使用。(a)[\1b] 等正则表达式中的 \1 要么是错误,要么是不必要的转义文字 1。在 JavaScript 中,它是八进制转义。
关于你的第二个问题:
- 对于这个难题,有没有更简单的解决方案?
恕我直言,你的正则表达式非常好,你可以在开始时将其缩短一点,如下所示:
(?=^.{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)