正确验证用户输入的名称

时间:2015-06-04 17:31:47

标签: regex

我正在尝试验证用户输入的名称。我需要确保输入的名称“字面上”有效。我在有限的知识中尝试了许多正则表达式,但它们似乎都没有完全发挥作用。例如/^[^.'-]+([a-zA-Z]+|[ .'-]{1})$/

由于我正在使用的PHP网站完全使用英文,因此只允许使用英文名称。 适用于过滤名称的规则是:

  1. 名称可能包含以下任何字符:[a-zA-Z .'-]
  2. 名称可以仅以字母或撇号开头
  3. [ .'-]中的任何字符在一段时间内可能不会出现多次,即没有'---'或' - '
  4. 空格不应该跟-'关注,也不应该在.-
  5. 之前

    任何人都可以提供正确的正则表达式来实现这些吗?

3 个答案:

答案 0 :(得分:2)

这是解决问题的正则表达式(regex101演示):

/^(?!.*(''| |--|- |' | \.| -|\.\.|\n))['a-z][- '.a-z]*$/gi

故障:

(?!.*(''| |--|- |' | \.| -|\.\.|\n))否定前瞻以确保找不到双重字符

['a-z]从其中一个字符

开始

[- '.a-z]*其他内容也可以包含空格和破折号,不是必需的(*代替+

答案 1 :(得分:1)

这应该适合你:

ERROR 2015-06-04 13:34:13,706 [main] org.mule.module.launcher.application.DefaultMuleApplication: null
java.io.IOException: Invalid keystore format

Demo at regex101.com

说明:

  • /^'?([a-z]+((\. )|( ')|['\- \.])?)+$/i 可选择以撇号
  • 开头
  • '?然后允许([a-z]+((\. )|( ')|['\- \.])?)+个至少包含1个字母字符的组,然后是特定字符的某些(两个)有效组合。这些是1-n". "(引用以查看空格)或任何单个特殊字符。
  • " '"匹配不区分大小写,否则您只需指定/i而不是[a-zA-Z]

我不确定[a-z]John,.Doe是否应被视为有效名称。用他的表达他们不会。

答案 2 :(得分:0)

通过限制一个巨大的断言必须做的所有回溯,你可能会获得更好的表现。

像这样......

 #  (?i)^(?=[a-z'])(?:[a-z]+|([ ](?!-)(?<!'[ ])|[.'-])(?!\1))*$

 (?i)                 # Modifier, case insensitive
 ^                    # BOS
 (?= [a-z'] )         # Starts with an alpha or apos '

 (?:                  # Cluster
      [a-z]+               # 1 to many alpha's
   |                     # or
      (                    # (1 start), Capture group, one of [ .'-]
           [ ]                  # Single space
           (?! - )              # not a dash - ahead
           (?<! ' [ ] )         # nor apos space '[ ] behind
        |                     # or,
           [.'-]                # Single dot . or apos ' or dash -
      )                    # (1 end)
      (?! \1 )             # Backref capt grp 1,
                           # not adjacent duplicate of one of [ .'-]
 )*                   # Cluster end, do 0 to many times
 $                    # EOS