0

我有这个正则表达式

^(\\w|@|\\-| |\\[|\\]|\\.)+$

我试图理解它到底做了什么,但我似乎无法得到任何结果......我只是无法理解无处不在的双反斜杠......不应该使用双反斜杠来获得单个反斜杠?

这个正则表达式是为了验证用户名不使用奇怪的字符和东西。

如果有人可以解释一下双反斜杠的事情。@_@

附加信息:我在 C# 中使用 Regex.IsMatch 获得了这个正则表达式,以检查我的用户名字符串是否与正则表达式匹配。这是一个asp网站。

4

5 回答 5

5

我的猜测是它只是转义了\因为反斜杠是 c# 中的转义字符。

string pattern = "^(\\w|@|\\-| |\\[|\\]|\\.)+$";

可以使用逐字字符串重写为

string pattern = @"^(\w|@|\-| |\[|\]|\.)+$";

现在更容易理解发生了什么。它将匹配任何单词字符、at-sign、连字符、空格、方括号或句点,重复一次或多次。^和分别匹配字符串的$开头和结尾,因此只允许使用这些字符。

因此,此模式等价于:

string pattern = @"^([\w@ \[\].-])+$";
于 2013-05-06T15:03:59.537 回答
4
  1. 双斜线应该是单斜线。双斜线用于转义斜线本身,因为斜线用于C# 字符串上下文中的其他转义字符,例如\n代表换行

  2. 整理出双斜线后,它变成^(\w|@|\-| |\[|\]|\.)+$

  3. 分解这个正则表达式,|表示 OR,并\w|@|\-| |\[|\]|\.表示\wor @or or \-or space or \[or or \]or \.。也就是说,任何字母数字字符、@-、空格[].字符。请注意,此斜杠是正则表达式转义,转义-,和字符[,因为它们在正则表达式上下文中都有特殊含义].

  4. 并且,+表示前一个标记(即\w|@|\-| |\[|\]|\.)重复一次或多次

  5. 因此,整个事物表示字母数字字符、@-、空格、[]字符的任意组合中的一个或多个.

于 2013-05-06T15:06:01.367 回答
2

有在线工具可以分析正则表达式。一旦这样在http://www.myezapp.com/apps/dev/regexp/show.ws

它报告的地方

Sequence: match all of the followings in order
    BeginOfLine
    Repeat
        CapturingGroup
            GroupNumber:1
            OR: match either of the followings
                WordCharacter
                @
                -
                [
                ]
                .
            one or more times
    EndOfLine

正如其他人所指出的,双反斜杠只是转义反斜杠,因此您可以将正则表达式嵌入字符串中。例如,“\\w”将被解析器解释为“\w”。

于 2013-05-06T15:08:09.787 回答
1

^ 表示行首。

括号用于分组

\w 是一个单词字符

| 表示或

@匹配@字符

\- 匹配连字符

[ 和 ] 匹配方括号

\。匹配一个时期

+ 表示一个或多个

$ 行尾。

因此,正则表达式用于匹配仅包含单词字符或@或连字符或空格或方括号或点的字符串。

于 2013-05-06T15:09:14.467 回答
1

这就是它的意思:

^(\\w|@|\\-| |\\[|\\]|\\.)+$

^- 表示正则表达式从字符串的开头开始。匹配不应从字符串的中间开始。

以下是括号中的个别内容:

\\w- 表示一个“单词”字符。通常,这显示为\w,但这是被转义的。

@- 表示允许使用 @ 符号

\\-- 表示-允许 a。这是转义的,因为破折号在正则表达式中可以有其他含义。由于它不在角色类中,我不认为这在技术上是必需的。

- 允许有空格

\\[\\]- [ 和 ] 是允许的。

\\.- 句点是有效字符。转义是因为句点在正则表达式中具有特殊含义。

现在所有这些字符都|在括号中作为分隔符 - 这意味着 OR。所以这些字符中的任何一个都是有效的。

+末尾的表示括号中描述的一个或多个字符是有效的。这$意味着正则表达式的结尾必须与字符串的结尾匹配。

请注意,如果您只是像这样为字符串添加前缀,则不需要双斜杠:

@"\w"是相同的"\\w"

于 2013-05-06T15:11:46.993 回答