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}ASCIILatin-1控制字符0x00-0x1F0x7F-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]+)*$`