到目前为止我已经
了^[0-9a-zA-Z-]+$
它可以很好地匹配数字,字母和短划线,但现在我想在大写和小写中排除net一词。
更具体地说,
匹配
net123
123net
字
等...
不匹配:
NET
净
如何将该细节添加到正则表达式?
谢谢!
答案 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.
}