正则表达式匹配数字,字母和破折号,但不匹配网络或NET

时间:2013-06-04 15:23:28

标签: .net regex vb.net

到目前为止我已经

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

它可以很好地匹配数字,字母和短划线,但现在我想在大写和小写中排除net一词。

更具体地说,

匹配

net123

123net

等...

不匹配:

NET

如何将该细节添加到正则表达式?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用此模式:

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

解释:

(?i)不区分大小写

[\da-mo-z-]没有n

的字符类

|

n+(?!et) 1次或多次没有et

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

net\d净和数字

此模式不包含包含单词net的字符串,但如果您只想排除单词net的字符串,则可以执行以下操作:

^(?i)(?!net$)[a-z\d-]+$

答案 1 :(得分: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-]+$"

答案 2 :(得分: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.
}