2

到目前为止我有

^[0-9a-zA-Z-]+$

它可以很好地匹配数字、字母和破折号,但现在我想排除大写和小写的 net 这个词。

进一步来说,

匹配:

净123

123网

单词

ETC...

不匹配:

如何将该详细信息添加到正则表达式?

谢谢!

4

3 回答 3

3

您可以使用此模式:

^(?i)([\da-mo-z-]+|n+(?!et)|(?<=\d)net|net\d)+$

解释:

(?i)不区分大小写

[\da-mo-z-]没有字符类n

|或者

n+(?!et)n 1 次或更多时间没有跟随et

(?<=\d)netnet 前面有一个数字

net\d网和一个数字

此模式排除包含 word 的字符串net,但如果您只想排除包含 word 的字符串net,您可以这样做:

^(?i)(?!net$)[a-z\d-]+$
于 2013-06-04T15:28:59.903 回答
1

我不确定这是最好的方法,但你可以这样做:

@"^(?(net$|NET$) |[0-9a-zA-Z-]+$)"

基本上,它检查字符串是“net”还是“NET”,如果是,则将其与空格匹配。那总是会失败的。否则,它会进行正常匹配。

这里有更详细的解释。

首先,它从一个基本的 if 语句和一个起始^锚点开始:^(?(if)then|else)

对于 if 语句,我们检查“net”或|“NET”。这些中的每一个都位于结束$锚点的前面,因此我们知道它不是子字符串。结果如下:^(?(net$|NET$)then|else)

然后,如果陈述是正确的,我将它与空格“”匹配。由于我们知道语句已经是“net”或“NET”,所以这部分总是会失败。这给我们留下了这个:^(?(net$|NET$) |else)

最后,我们将您之前的模式插入到 else 子句中以获得:^(?(net$|NET$) |[0-9a-zA-Z-]+$)

看到上面的答案后,我想起了负前瞻,它通过不需要愚蠢的 if 语句来简化这一点。使用前瞻,这个答案看起来像这样:

@"^(?!net$|NET$)[0-9a-zA-Z-]+$"
于 2013-06-04T15:54:15.280 回答
0

只需在开头添加一个否定的前瞻断言,如下所示:

if (Regex.IsMatch(text, @"
    # Match word that is not NET
    ^              # Anchor to start of string.
    (?!net$)       # Assert that entire string is not NET.
    [0-9a-zA-Z-]+  # Match word.
    $              # Anchor to end of string.
    ", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace)) {
    // "Good" word that is not net, NET, Net,...
} else {
    // Not a "good" word.
} 
于 2013-06-04T18:11:31.933 回答