x|y

如果没有包围在()里,其范围是整个正则表达式。

例如:

  • “z|food”能匹配“z”或“food”。
  • “(?:z|f)ood”则匹配“zood”或“food”。

Unicode处理

在.NET、Java、JavaScript、Python的正则表达式中,可以用\uXXXX表示一个Unicode字符,其中XXXX为四位16进制数字。

Unicode Property:字符属于标点、空格、字母等等。每个Unicode字符只能属于唯一Unicode Property。
.NET、Java、PHP和Ruby等语言支持。具体分类为:

  • 字符

    1
    \p{L}
    • \p{Ll}或\p{Lowercase_Letter}:小写字符(必须有大写的形式)。
    • \p{Lu}或\p{Uppercase_Letter}:大写字符(必须有小写的形式)。
    • \p{Lt}或\p{Titlecase_Letter}:全词首字母大写的字符。
    • \p{L&}或\p{Cased_Letter}:存在大小写形式的字符(Ll, Lu, Lt的组合)。
    • \p{Lm}或\p{Modifier_Letter}:音标修饰字符。
    • \p{Lo}或\p{Other_Letter}:不具有大小写的字符或字形。
  • 附加符号

    1
    \p{M}
    • \p{Mn}或\p{Non_Spacing_Mark}:与其他字符结合,不额外占用空间的字符,例如日耳曼语元音变音。
    • \p{Mc}或\p{Spacing_Combining_Mark}:与其他字符结合,额外占用空间的字符,例如马拉雅拉姆文#元音字母及附标。
    • \p{Me}或\p{Enclosing_Mark}:包含其他字符的字符,例如圆圈、方块。
  • 分隔符p{Z}

    • \p{Zs}或\p{Space_Separator}:a whitespace character that is invisible, but does take up space.
    • \p{Zl}或\p{Line_Separator}:line separator character U+2028.
    • \p{Zp}或\p{Paragraph_Separator}:paragraph separator character U+2029.
  • 符号

    1
    \p{S}
    • \p{Sm}或\p{Math_Symbol}:数学符号。
    • \p{Sc}或\p{Currency_Symbol}:通货符号。
    • \p{Sk}或\p{Modifier_Symbol}:组合为其他字符的符号。
    • \p{So}或\p{Other_Symbol}:其他符号。
  • 数值字符

    1
    \p{N}
    • \p{Nd}或\p{Decimal_Digit_Number}:所有文本中的数字0至9字符,不含形意符号。
    • \p{Nl}或\p{Letter_Number}:看起来像字母的符号,包含罗马数字。
    • \p{No}或\p{Other_Number}:上角标或下角标数字,或者其他不属于0至9的数字。不含形意符号。
  • 标点符号

    1
    \p{P}
    • \p{Pd}或\p{Dash_Punctuation}:任何种类的连字号或连接号。
    • \p{Ps}或\p{Open_Punctuation}:任何种类开括号。
    • \p{Pe}或\p{Close_Punctuation}:任何种类闭括号。
    • \p{Pi}或\p{Initial_Punctuation}:任何种类开引号。
    • \p{Pf}或\p{Final_Punctuation}:任何种类闭引号。
    • \p{Pc}或\p{Connector_Punctuation}:连接词的标点符号,如下划线。
    • \p{Po}或\p{Other_Punctuation}:其他标点符号。
  • 其它符号

    1
    \p{C}

    (包括不可见控制字符与未用码位)

    • \p{Cc}或\p{Control}:ASCII或Latin-1控制字符0x00-0x1F与0x7F-0x9F。
    • \p{Cf}或\p{Format}:不可见的格式化指示字符。
    • \p{Co}或\p{Private_Use}:私用码位。
    • \p{Cs}或\p{Surrogate}:UTF-16编码的代理对的一半。
    • \p{Cn}或\p{Unassigned}:未被使用的码位。

Unicode Block:按照编码区间划分Unicode字符,每个Unicode Block中的字符编码属于一个编码区间。例如Java语言\p{ InCJK_Compatibility_Ideographs },.NET语言\p{IsCJK_Compatibility_Ideographs}。

Unicode Script:按照字符所属的书写系统来划分Unicode字符。PHP和Ruby(版本不低于1.9)支持Unicode Script。例如\p{Han}表示汉字(中文字符)。

示例

用户昵称的正则匹配, 合法的字符有 0-9, A-Z, a-z, _, 汉字

1
2
3
4
5
func IsValidEmailNickName(nickName string) bool {
nickNamePattern := `^[_.a-z0-9A-Z\p{Han}]+$`
nickNameRegexp := regexp.MustCompile(nickNamePattern)
return nickNameRegexp.MatchString(nickName)
}

pythonic的NickName

1
2
3
4
5
6
7
8
// 用户昵称的正则匹配, 合法的字符有 0-9, A-Z, a-z, _, 汉字
// 字符 '_' 只能出现在中间且不能重复, 如 "__"
nicknamePattern = `^[a-z0-9A-Z\p{Han}]+(_[a-z0-9A-Z\p{Han}]+)*$`

// 用户名的正则匹配, 合法的字符有 0-9, A-Z, a-z, _
// 第一个字母不能为 _, 0-9
// 最后一个字母不能为 _, 且 _ 不能连续
usernamePattern = `^[a-zA-Z][a-z0-9A-Z]*(_[a-z0-9A-Z]+)*$`