Regex限制具有特定字母组合的单词(按任何顺序)
本文关键字:单词 任何 顺序 组合 Regex | 更新日期: 2023-09-27 18:23:56
这个有点复杂,有点超出我的能力范围。我想对单词列表进行排序,并删除那些不包含特定字符集的单词,但这些字符可以按任何顺序排列,有些字符可能比其他字符出现得更多。
我希望正则表达式查找任何带有以下内容的单词:
e
0或1次a
0或1次t
0或1或2倍
例如,以下方法可行:
eat
tea
tate
tt
a
e
以下内容不适用
eats
teas
tates
ttt
aa
ee
Lookaround Regex对我来说是新的,所以我不能100%确定语法(任何使用带解释的Lookaround的答案都会很棒)。到目前为止我的最佳猜测:
Regex regex = new Regex(@"(?=.*e)(?=.*a)(?=.*t)");
lines = lines.Where(x => regex.IsMatch(x)).ToArray(); //'text' is array containing words
确定:
'b(?:e(?!'w*e)|t(?!(?:'w*t){2})|a(?!'w*a))+'b
解释:
'b # Start of word
(?: # Start of group: Either match...
e # an "e",
(?!'w*e) # unless another e follows within the same word,
| # or
t # a "t",
(?! # unless...
(?:'w*t){2} # two more t's follow within the same word,
) #
| # or
a # an "a"
(?!'w*a) # unless another a follows within the same word.
)+ # Repeat as needed (at least one letter)
'b # until we reach the end of the word.
在regex101.com.上进行实时测试
(为了简单起见,我使用了'w
字符类;如果您想以不同的方式定义允许的"单词字符",请相应地替换它)
这可能和其他的一样,我还没有格式化它们。
请注意,断言是强制匹配的,它们不能是可选的
(除非特别设置为可选,但为什么?)并且不直接受回溯的影响
这是有效的,解释在格式化的正则表达式中。
已更新
要使用空白边界,请使用以下命令:
(?<!'S)(?!'w*(?:e'w*){2})(?!'w*(?:a'w*){2})(?!'w*(?:t'w*){3})[eat]+(?!'S)
格式化:
(?<! 'S )
(?!
'w*
(?: e 'w* ){2}
)
(?!
'w*
(?: a 'w* ){2}
)
(?!
'w*
(?: t 'w* ){3}
)
[eat]+
(?! 'S )
要使用普通的单词边界,请使用以下内容:
'b(?!'w*(?:e'w*){2})(?!'w*(?:a'w*){2})(?!'w*(?:t'w*){3})[eat]+'b
格式化:
'b # Word boundary
(?! # Lookahead, assert Not 2 'e' s
'w*
(?: e 'w* ){2}
)
(?! # Lookahead, assert Not 2 'a' s
'w*
(?: a 'w* ){2}
)
(?! # Lookahead, assert Not 3 't' s
'w*
(?: t 'w* ){3}
)
# At this point all the checks pass,
# all thats left is to match the letters.
# -------------------------------------------------
[eat]+ # 1 or more of these, Consume letters 'e' 'a' or 't'
'b # Word boundary