我在我的应用程序中发现了一个奇怪的行为,正则表达式和@字符后跟(。
以下是我的.Net JScript改编语言的两个例子:
//Using .Net Regex class
echo(Regex.IsMatch(".DOMAIN.S", "^\\.DOMAIN\\.S(\\.\\w*|\\b)"));//True
echo(Regex.IsMatch(".DOMAIN.@", "^\\.DOMAIN\\.@(\\.\\w*|\\b)"));//False !!
//Using JScript syntax
var re = /^\.DOMAIN\.S(\.\w*|\b)/g;
echo(re.exec(".DOMAIN.S") != null); //Ok
re = /^\.DOMAIN\.@(\.\w*|\b)/g;
echo(re.exec(".DOMAIN.@") != null); //Null !!
删除(。\ w * | \ b)使测试正常。所以我解释@后跟a(在正则表达式中有特殊含义)。
1。它的含义是什么?
2。什么应该是好的表达?
非常感谢。
ED
答案 0 :(得分:3)
Regex.IsMatch(".DOMAIN.@", "^\\.DOMAIN\\.@(\\.\\w*|\\b)")
返回false,因为^\\.DOMAIN\\.@
与整个字符串匹配,然后您正在寻找一个句点和单词字符,没有字符或单词边界。根据{{3}}:
有三种不同的立场 有资格作为单词边界:
- 在字符串中的第一个字符之前,如果第一个字符是
字符。- 在字符串中的最后一个字符之后,如果最后一个字符是
字符。- 字符串中的两个字符之间,其中一个是单词 性格和另一个不是 字符。
at符号不是单词字符,因此第二个项目符号为false。
所以,要真正回答你的问题,at符号在Regex中并不特别。
答案 1 :(得分:1)
导致您出现问题的不是@
,而是\b
。
\b
匹配单词边界:".DOMAIN.S"
末尾有一个,而".DOMAIN.@"
末尾没有一个。{1}}。这解释了为什么你在第一种情况下获得匹配而不是第二种情况。