【问题标题】:Regex to find any permutations of letters in string [duplicate]正则表达式查找字符串中字母的任何排列[重复]
【发布时间】:2015-06-10 07:42:11
【问题描述】:

我有这个正则表达式:

 ([abc])(?!\1)([abc])(?!\2|\1)([abc])

在给定字符串中查找“abc”(abc、acb、bac、bca、cab 和 cba)的任何排列,例如:

 aabbccabcabbccaassbbsdddbbsbdbabc

那个正则表达式运行良好,但现在我需要另一个正则表达式来做同样的事情,但所有排列都没有重复“abbc”(12 种组合)

我需要在一个字符串中找到 4 个字符,其中一个“a”、两个“b”和一个“c”。不管顺序,但必须是连续的。 (abbc, babc, bbca...)

我的问题与建议的不同,因为它有一个字符必须重复 2 次​​p>

 1. Find [abc]
 2. Find "a" or "c" if it is not in 1.
    Find "b"
 3. Find "a" or "c" if it doesn't appear in 1. or 2.
    Find "b" if it is not alreday 2 times
 4. Find "a" or "c" if it doesn't appear in 1. or 2 or 3.
    Find "b" if it is not alreday 2 times

【问题讨论】:

  • 你使用什么语言?
  • 语言 c#,不重复,这里我需要“1223”或“abbc”,其中一个字符必须是 2 次,其他字符只有 1 次
  • 这个正则表达式是否有用,您应该在此处将其标记为答案:stackoverflow.com/questions/30738714/…
  • @nhahtdh - 你确定这是重复的吗?其他两个问题都不要求重复字符,这更复杂。此外,不同的语言有不同的解决方案。
  • @Kobi:stackoverflow.com/questions/10727118/… 上公认的解决方案可以处理这种情况。它是用伪代码编写的。

标签: c# regex


【解决方案1】:

C# 正则表达式有一个称为balancing groups 的功能,可用于计数。

您可以使用这个正则表达式 (working example at Regex Storm):

(?:(?<A>a)|(?<B>b)|(?<C>c)){4}(?<-A>)(?<-B>){2}(?<-C>)
  • (?&lt;A&gt;a) - 匹配 a 并将其推送到名为 A 的堆栈中。
  • (?&lt;-A&gt;) - 从堆栈 A 中弹出。
  • (?&lt;-B&gt;){2} - 从堆栈 B 中弹出两次。

如果正则表达式引擎无法从堆栈中弹出,则匹配失败,因此这为我们提供了一种简单的方法来计算匹配的字符。

还有其他方法,包括可以在其他正则表达式风格(其他语言)中使用的方法,但是这种方法有一个好处是它可以很好地扩展并且没有重复:如果你想要 7 个字符,即 4 个As, 2个Bs和1个C,这是一个微不足道的变化。

【讨论】:

  • 我认为这个解决方案没有问题。看起来效果很好。谢谢科比
  • 非常好的答案! ★★★
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多