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

时间:2011-09-01 00:24:18

标签: c# regex

我需要正则表达式来满足两个条件:

  1. 包含子字符串(例如foo):\b\w*foo\w*\b
  2. 固定数量的字符\b\w{N,M}\b
  3. 如何统一这两个条件?

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

    N = 4且M = 5

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

    但是这种方法很可怕。 N = 4,M = 20

2 个答案:

答案 0 :(得分:3)

要“和”多个模式,您可以使用零宽度前瞻。我不知道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#。只是想提出想法。)

答案 1 :(得分:0)

我认为在这种情况下最明智的是不加入两个正则表达式。只需进行两次正则表达式搜索,或者首先找到符合其中一个正则表达式的单词,然后在其他正则表达式中搜索您找到的每个单词。乍一看,使用foo语法指定{}之前和之后的元素数量似乎并不容易。