c# - 匹配连续的 2 位或 3 位
问题描述
我正在运行这个函数来生成一个包含 256 个单词的单词表。然后我使用第二个声明来过滤掉错误的匹配项,我只剩下 54 个单词。我正在寻找一种使用正则表达式或其他方式来匹配它的方法,以便它看起来干净而不那么草率。任何帮助将不胜感激。
GenerateStrings(new char[] { 'D', 'U' }, 8);
public IEnumerable<String> GenerateStrings(IEnumerable<char> characters, int length) {
if (length > 0) {
foreach (char c in characters) {
foreach (String suffix in GenerateStrings(characters, length - 1)) {
yield return c + suffix;
}
}
} else {
yield return string.Empty;
}
}
if (!eachWord.Contains("UUUUU") && !eachWord.Contains("DDDDD") && !eachWord.Contains("UUUUD") && !eachWord.Contains("DDDDU") && !eachWord.Contains("UUUDDDD") && !eachWord.Contains("DDDUUUU")) {
if (!eachWord.StartsWith("UUUU") && !eachWord.StartsWith("DDDD")) {
if (eachWord.StartsWith("UUDD") || eachWord.StartsWith("DDUU") || eachWord.StartsWith("DDUUU") ||
eachWord.StartsWith("UUDDD") || eachWord.StartsWith("DDDUU") || eachWord.StartsWith("UUUDD") ||
eachWord.StartsWith("DUUDD") || eachWord.StartsWith("DDDUU") || eachWord.StartsWith("DDDUUU") ||
eachWord.StartsWith("DUUDDD") || eachWord.StartsWith("DDDDUU") || eachWord.StartsWith("DUUUDD") ||
eachWord.StartsWith("UUUDD") || eachWord.StartsWith("UDDUU") || eachWord.StartsWith("UDDUUU") ||
eachWord.StartsWith("UUUDDD") || eachWord.StartsWith("UDDDUU") || eachWord.StartsWith("UUUUDD")) {
//good word
}
}
}
解决方案
如果你想匹配所有好的值,你可以使用一个交替组合一个否定的前瞻,(?!
排除右边的一些字符。
^(?:D?UUU?DD(?!DD)|U?DDD?UUU?(?!U))[UD]+$
解释
^
字符串的开始(?:
非捕获组D?UUU?DD(?!DD)
匹配 optionalD
,然后是 UU 和 optionalU
,然后是 DD 和 assert notDD
在它之后直接向右|
或者U?DDD?UUU?(?!U)
匹配 optionalU
, thenDD
和 optionalD
, thenUU
和 optionalU
断言不U
直接向右。
)
关闭非捕获组[UD]+
匹配 1+ 次U
或D
$
字符串结束
推荐阅读
- r - 在R中设置空间点数据框
- ocaml - Ocaml 语法很奇怪
- python - 将较少的参数传递给函数然后在 Python 中定义
- python - 在回答 Webrequest 时做出反应 - Python 3.7
- java - Android Studio(将参数从活动发送到另一个活动)
- javascript - 将文件从flutter发送到spring webflux
- sql - 查找 SQL 中连续行之间的年份差异?
- vee-validate - vee-validate 3 个可选地址字段,但一个是必需的
- php - 小改动的 Git 工作流程
- react-native - 在本机反应中通过图像中的路径时出错