首页 > 解决方案 > 正则表达式匹配排列序列

问题描述

给定一组 n 个字符,我们需要什么正则表达式来匹配这些字符的 0-x 排列序列?

我们想要排列。给定一组 3 个字符 A、B、C,我们要匹配 ABC、ACB、BAC、BCA、CAB、CBA。

但是,我们想要匹配这些排列的序列。序列可能包含0个或多个排列,意味着我们要匹配空字符串,ABC,ABCCA,BACCAB,BCAABCCBAABC等。

我能够找到匹配排列的解决方案,但无法修改它以匹配排列序列

我知道有时使用的正则表达式引擎可能会有所不同。我想在 C# 的Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Matches方法中使用这个正则表达式,如果这会有所作为。我们只是想检查测试方法的输出字符串是否匹配这个正则表达式,即是给定字符集的排列序列。

标签: c#regex

解决方案


我不能太推荐1在这里使用正则表达式!

n = 3当 for和字符是'A','B'和时,您可以使用以下正则表达式来测试字符串的一致性'C'

/^(?:([ABC])(?!\1)([ABC])(?!\1|\2)[ABC])*$/

演示

正则表达式可以通过以自由间距模式编写来进行自我记录:

/
^           # match beginning of line
(?:         # begin non-capture group
  ([ABC])   # match 'A', 'B' or 'C' in capture group 1
  (?!\1)    # next character cannot be the content of capture group 1
  ([ABC])   # match 'A', 'B' or 'C' in capture group 2
  (?!\1|\2) # next character cannot be the content of capture group 1 or 2
  [ABC]     # match 'A', 'B' or 'C'
)           # end non-capture group
*           # execute non-capture group 0+ times
$           # match end of line
/x          # free-spacing mode

(?!\1|\2)负前瞻

我使用了行首和行尾锚点来促进链接测试,但字符串首尾锚点会更合适(\A\z)。

1 意为字面解释。


推荐阅读