我正在尝试验证用户输入的名称。我需要确保输入的名称“字面上”有效。我在有限的知识中尝试了许多正则表达式,但它们似乎都没有完全发挥作用。例如/^[^.'-]+([a-zA-Z]+|[ .'-]{1})$/
由于我正在使用的PHP网站完全使用英文,因此只允许使用英文名称。 适用于过滤名称的规则是:
[a-zA-Z .'-]
[ .'-]
中的任何字符在一段时间内可能不会出现多次,即没有'---'或' - '-
或'
关注,也不应该在.
或-
任何人都可以提供正确的正则表达式来实现这些吗?
答案 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
说明:
/^'?([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