正则表达式匹配N到M个字符之间的单词,包含一个固定的子字符串

本文关键字:单词 包含一 字符串 之间 字符 正则表达式 | 更新日期: 2023-09-27 18:07:16

我需要满足两个条件的单词的正则表达式:

  1. 包含子字符串(例如foo): 'b'w*foo'w*'b
  2. 固定字符数'b'w{N,M}'b

如何统一这两个条件?

如果N和M很小,可以使用OR。

N = 4, M = 5

('bfoo'w{1,2}'b)|('b'wfoo'w{0,1}'b)|('b'w'wfoo'b)

但是这种方法对于eg来说是可怕的。N = 4, M = 20

正则表达式匹配N到M个字符之间的单词,包含一个固定的子字符串

对于"answers"多个模式,您可以使用零宽度前视。我不知道c#是否支持这些。在Perl中,它看起来像:

/
    'b
    (?= 'w{N,M} 'b )
    (?= 'w* foo 'w* 'b )
/x

/
    'b
    (?= 'w{N,M} 'b )
    'w* foo 'w* 'b
/x

/
    'b
    (?= 'w{N,M} 'b )
    'w* foo
/x
不过,最好不要把所有东西都塞进一个模式中。我会写
my @words = /'b'w{N,M}'b/g;  # Find what we define to be words.
grep /foo/, @words           # Check if any of them are acceptable to us.

(对不起,又是Perl,但我不懂c#。)

我认为在这种情况下最明智的做法是不要将两个正则表达式连接起来。只需进行两次正则表达式搜索,或者首先查找满足其中一个正则表达式的单词,然后为找到的每个单词搜索另一个正则表达式。乍一看,用{}语法指定foo前后有多少个元素似乎并不容易。