gpt4 book ai didi

java - RegExp 匹配由有限字符集形成的字符串而不重复使用任何字符

转载 作者:搜寻专家 更新时间:2023-11-01 04:04:15 25 4
gpt4 key购买 nike

我有一堆这样的字符:A B B C D

我有几个这样的空格:_ _ _

有没有一种方法可以使用正则表达式来匹配可以通过将可用字符“拖”到空白处而形成的任何字符串?

所以在这个例子中,这些是一些有效的匹配:

A B C
A B B
B C B
D A B

但是这些都是无效的:

A A B    // Only one 'A' is available in the set
B B B // Only two 'B's are available in the set

抱歉,如果之前已经有人问过。

最佳答案

vks's solution would work properly ,这里是通过添加来优化以满足 "_ _ _" 规则:

^(?!(?:[^A]*A){2})(?!(?:[^B]*B){3})(?!(?:[^C]*C){2})(?!(?:[^D]*D){2})(?:[ABCD](?:\s|$)){3}

Here is a regex demo .

原始正则表达式的变化:

  • 捕获组已被删除,因为我们使用 Java - Java 正则表达式实现专门花时间在匹配期间编写捕获组。
  • 为了正则表达式的可读性, anchor ^ 被移到了前面。

正则表达式解释:

  • ^ 在比赛开始时声明位置。
  • (?! 否定前瞻 - 在不移动指针的情况下断言我们的位置匹配以下内容:
  • (?:[^A]*A){2} 两个 “A”(文字字符),带有非 “A”s 以最佳方式滚动。
  • ) 关闭群组。
  • (?!(?:[^B]*B){3}) 与上述组相同 - 断言不是三个"B"在比赛中。
  • (?!(?:[^C]*C){2}) 断言两个“C” s 在比赛中。
  • (?!(?:[^D]*D){2}) 断言两个“D” s 在比赛中。
  • (?: 非捕获组:匹配以下不捕获。
  • [ABCD] “A”“B”“C” 列表中的任何字符,或 “D”
  • (?:\s|$) 空格,或字符串结尾。
  • ){3} 三次 - 必须恰好匹配序列三次才能满足 "_ _ _" 规则。

使用正则表达式:

boolean fulfillsRule(String str) {
Pattern tripleRule = Pattern.compile("^(?!(?:[^A]*A){2})(?!(?:[^B]*B){3})(?!(?:[^C]*C){2})(?!(?:[^D]*D){2})(?:[ABCD](?:\s|$)){3}");
return tripleRule.matcher(str).find();
}

关于java - RegExp 匹配由有限字符集形成的字符串而不重复使用任何字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com