Regex 正确验证用户输入的名称
我正在尝试验证用户输入的名称。我需要确保输入的名称“字面上”有效。在我有限的知识范围内,我尝试了许多正则表达式,但没有一个能完全工作。例如/^[^.'-]+[a-zA-Z]+|[.-]{1}$/ 因为我正在开发的PHP网站完全是英文的,所以只允许使用英文名称。 适用于筛选名称的规则有: 名称可以包含以下任何字符:[A-zA-Z.'-] 名称只能以字母或撇号开头 [.-]中的任何字符在一段时间内不得出现一次以上,即“否”--“或“-” 空格不应紧跟在“或”之后,也不应紧跟在“或”之前。或-Regex 正确验证用户输入的名称,regex,Regex,我正在尝试验证用户输入的名称。我需要确保输入的名称“字面上”有效。在我有限的知识范围内,我尝试了许多正则表达式,但没有一个能完全工作。例如/^[^.'-]+[a-zA-Z]+|[.-]{1}$/ 因为我正在开发的PHP网站完全是英文的,所以只允许使用英文名称。 适用于筛选名称的规则有: 名称可以包含以下任何字符:[A-zA-Z.'-] 名称只能以字母或撇号开头 [.-]中的任何字符在一段时间内不得出现一次以上,即“否”--“或“-” 空格不应紧跟在“或”之后,也不应紧跟在“或”之前。或- 任何人
任何人都可以提供适当的正则表达式来实现这些功能吗?下面是一个解决问题的正则表达式演示: /^|\n['a-z][-'.a-z]*$/gi 细分: |\n负向前看,以确保未找到重复字符 ['a-z]从这些字符中的一个开始
[-'.a-z]*其余部分也可以包含空格和破折号,并且不是必需的*而不是+这应该适合您:
/^'?([a-z]+((\. )|( ')|['\- \.])?)+$/i
说明:
'? 可以选择以撇号开头
[a-z]+\.|'|['\-\.]?+之后允许至少包含1个字母字符的1-n组,后跟特殊字符的某些有效组合。这些是引号以查看空格或任何单个特殊字符。
/我匹配不区分大小写,否则只需指定[a-zA-Z]而不是[a-Z]。
我不确定John、.Doe或“”是否应被视为有效名称。用我的表达式,它们不会。通过限制大型断言必须执行的所有回溯,您可能会获得更好的性能 像这样的
# (?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
希伯来语、阿拉伯语、俄语,。。。名称?@CommuSoft目前,这些名称不在考虑之列。姓名应以英文输入。整个网站都是英文的。什么语言PHP、Java、JavaScript?@Marvin PHP。我使用的是preg_match大多数可用的方法都不是万无一失的,这是因为没有万无一失的方法。@KevinB:谢谢,我没有注意到这个要求。我已经为回复更新了regex.Thanx。它起作用了。我只是根据编辑后的问题修改了它:/^?!.*.-'.-'.-'.\.\.\.\。['a-z][-.'a-z]*$/除非后面跟一个空格,否则它可以工作。。此外,还必须允许使用像O'Brien这样的名称。现在它可以完美地工作。我将其与两个答案进行了比较,找到了Brian的答案,在大多数测试用例中,他保留了较少的步骤。所以,我选择了这个作为正确的答案。再说一遍