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

Regex限制具有特定字母组合的单词(按任何顺序)

确定:

'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