到目前为止我有
^[0-9a-zA-Z-]+$
它可以很好地匹配数字、字母和破折号,但现在我想排除大写和小写的 net 这个词。
进一步来说,
匹配:
净123
123网
单词
ETC...
不匹配:
网
网
如何将该详细信息添加到正则表达式?
谢谢!
您可以使用此模式:
^(?i)([\da-mo-z-]+|n+(?!et)|(?<=\d)net|net\d)+$
解释:
(?i)
不区分大小写
[\da-mo-z-]
没有字符类n
|
或者
n+(?!et)
n 1 次或更多时间没有跟随et
(?<=\d)net
net 前面有一个数字
net\d
网和一个数字
此模式排除包含 word 的字符串net
,但如果您只想排除包含 word 的字符串net
,您可以这样做:
^(?i)(?!net$)[a-z\d-]+$
我不确定这是最好的方法,但你可以这样做:
@"^(?(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-]+$"
只需在开头添加一个否定的前瞻断言,如下所示:
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.
}