regex 多匹配序列的正则表达式

2w3rbyxf  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(87)

我需要一个匹配DK的正则表达式|EK| KD| KE.用K[D|E]|[D|E]K看起来很简单,但这对KDK或KEK序列不起作用(至少在regx101上不起作用)。此正则表达式将匹配前2个字符,但不匹配最后2个字符。它将匹配一个4个字符的字符串,如KDKD或KDKE或KEKE,但向其中任何一个添加K也无法匹配最后2个DK或EK字符。
什么正则表达式将允许这些类型的序列(其中一些是回文)匹配?

编辑为了澄清一点,KDK将匹配我的简单正则表达式中的第一个选项(KD),但不匹配第二个选项(DK)。显然这两个匹配有重叠,我正在寻找一个正则表达式,当有重叠时,它将允许匹配。
EDIT 2而且,我已经意识到这并不一定局限于回文-原始帖子更正,上面。
EDIT 3以下所有内容均应匹配。我不认为这是一个详尽的清单。对于非匹配,不包含列表对(KD、KE、EK、DK)的任何字符都不应匹配。例如,KDDDK将匹配前2个字符(KD)和后2个字符(DK),但不匹配中间的D,因为它的前面和后面都没有K。

KD
KE
EK
DK
KDK
KEK
EKE
DKD
EKD
DKE
KDKD
KDKE
KEKD
KEKE
KDDK
KEEK
DKDK
EKDK
KDEK
DKKD
DKKE
EKKE
EKKD
KEEKE
omtl5h9j

omtl5h9j1#

不要在你的替代方案[D|E]中使用管道分隔符,只使用[DE]
你可以做的是使用一个积极的lookahead (?=)或lookbehind (?<=)来不消耗匹配:

(?=(K[DE]|[DE]K))

https://regex101.com/r/jotsST/1
| 匹配结果| Matches results |
| --| ------------ |
| KD| KD |
| KE| KE |
| DK| DK |
| EK| EK |
| DK、KE| DK, KE |
| KD、DK| KD, DK |
| KE、EK| KE, EK |
| KE,EK,KE| KE, EK, KE |
| KD、DK| KD, DK |
| EK,KD,EK| EK, KD, EK |

w7t8yxp5

w7t8yxp52#

在匹配D或E时,使用查找来匹配K,但不要消耗K。

^(K*([ED](?=K)|(?<=K)[ED])K*)*

参见live demo

7xzttuei

7xzttuei3#

  • 再次编辑:* 由于 *3是幻数 * 这将做奇数组合。

其中对称性要求至少为3。
这个可以做9753
将此用作模板。
只需添加更多的组(总奇数),将其扩展到无穷大。
如果你假设一个D K E的回文...

(?=([DKE])((?!\1)[DKE])([DKE])([DKE]?)([DKE]?)([DKE]?)([DKE]?)([DKE]?)([DKE]?))(?:\9\8\7\6\5\4\3\2\1|\7\6\5\4\3\2\1|\5\4\3\2\1|\3\2\1)

https://regex101.com/r/QRKqNo/1
说明

(?=
    ( [DKE] )                     # (1)
    (                             # (2 start)
       (?! \1 )
       [DKE] 
    )                             # (2 end)
    ( [DKE] )                     # (3)
    ( [DKE]? )                    # (4)
    ( [DKE]? )                    # (5)
    ( [DKE]? )                    # (6)
    ( [DKE]? )                    # (7)
    ( [DKE]? )                    # (8)
    ( [DKE]? )                    # (9)
 )
 (?:
    \9 \8 \7 \6 \5 \4 \3 \2 \1    # 9 ckeck
  | \7 \6 \5 \4 \3 \2 \1          # 7 check
  | \5 \4 \3 \2 \1                # 5 check
  | \3 \2 \1                      # 3 check
 )

要以重叠的方式执行相同的操作,请将结尾处的 checks 移动到Assert底部的内部。
注意对称性就像它自己的回溯过滤器,对我来说
我觉得很惊讶。

相关问题