我需要编写一个正则表达式,允许标准字符[a-zA-Z0-9]
加上每个单词之间的一个空格,变音符号[äöüÄÖÜ]
,点(.
)和连字符({{ 1}})并没有其他特殊字符。
例如:
应该允许以下:
-
不应允许以下内容:
Dr. Aaryan Joshi
Phill Rozer MSc.
Ajay Verma5
Rajan-Verma MSc.
答案 0 :(得分:7)
试试这个
^(?! )(?!.* $)(?=[^.]*\.?[^.]*$)(?=[^-]*-?[^-]*$)(?!.*? {2,})[a-zA-Z0-9äöüÄÖÜ .-]+$
^
和$
是anchors,匹配字符串的开头和结尾
[a-zA-Z0-9äöüÄÖÜ .-]+
是带有量词的character class(+
=> 1或更多)此部分与您要允许的所有字符匹配。
(?!)
和(?=)
为negative/positive look aheads。他们验证您设置的条件。
(?! )
不以空格开头
(?!.* $)
不以空格结束
(?=[^.]*\.[^.]*$)
只允许一个点,字符串中的任何位置
(?=[^-]*-[^-]*$)
只允许一个短划线,在字符串中的任何位置
(?!.*? +)
不允许按顺序排列多个空格
答案 1 :(得分:3)
有时更容易指定不允许的内容。以下内容查找未批准的字符,两个连续的空格以及两个以上的点或连字符。
([^a-zA-Z0-9äöüÄÖÜ. -]| |\..*\.|-.*-)
如果在字符串的开头或结尾不允许使用空格,您可以使用:
([^a-zA-Z0-9äöüÄÖÜ. -]|^ | $| |\..*\.|-.*-)
答案 2 :(得分:1)
我的解决方案是:
^(([a-zA-Z0-9äöüÄÖÜ]+(-[a-zA-Z0-9äöüÄÖÜ]+)?\s)*([a-zA-Z0-9äöüÄÖÜ]*\.)|
(\.[a-zA-Z0-9äöüÄÖÜ]+))|((([a-zA-Z0-9äöüÄÖÜ]*\.)|(\.[a-zA-Z0-9äöüÄÖÜ]+)\s)?
([a-zA-Z0-9äöüÄÖÜ]+(-[a-zA-Z0-9äöüÄÖÜ]+)?\s)*[a-zA-Z0-9äöüÄÖÜ]+
(-[a-zA-Z0-9äöüÄÖÜ]+)?)$
分解
带连字符匹配的无点字: 假设在开头或结尾不允许使用连字符(如果存在)。如果这个假设是错误的,那么很容易相应地进行调整。
[a-zA-Z0-9äöüÄÖÜ]+-[a-zA-Z0-9äöüÄÖÜ]+
没有连字符匹配的无点词:
[a-zA-Z0-9äöüÄÖÜ]+
这样一个无点的单词,无论是否有单个连字符(最多只有一个)都匹配:
[a-zA-Z0-9äöüÄÖÜ]+(-[a-zA-Z0-9äöüÄÖÜ]+)?
我们可以使用一般的设计模式(没有双关语),以获得任意数量的Y的一个X:
(Y*X)|(XY+)
因此,应用此规则时,只有一个点的虚线词匹配:
([a-zA-Z0-9äöüÄÖÜ]*\.)|(\.[a-zA-Z0-9äöüÄÖÜ]+)
同样得到一个只有一个点缀的单词流,我们稍微修改一个空格分隔符的一般规则。所以只有一个虚线匹配的单词串:
((Y\s)*X)|(X\s(Y\s)*Y)
其中: 1. Y =无点字的正则表达式 2. X =虚线词的正则表达式
同样,只有无点字的流将匹配:
(Y\s)*Y
其中Y与以前一样。
结合两个元正则表达式,一个单词串最多只有一个虚线词匹配:
((Y\s)*X)|((X\s)?(Y\s)*Y)
其中X和Y与之前一样。
最后一步是将X和Y替换回前面的meta-regex以产生我提出的解决方案。我的解决方案非常好用的是它不使用预测,因此解析速度更快,适用于各种正则表达式,包括XML Schema,XPATH和XSLT的非常原始的风格。
如果需要,在开头和结尾添加^和$。
答案 3 :(得分:1)
在标准正则表达式中,您可以使用unicode字符属性类来捕获变音符号(例如\ p {Mn})。
不幸的是,JavaScript Regex不支持此功能,因此您需要明确指定要接受的字符。
因此,这将为您提供帮助
(?:[a-zA-Z\däöüÄÖÜ-]+(?:\.(?!.*\.))?[ ]{0,1})+
如果您只想强制执行一个连字符,请将其更改为此
(?:[a-zA-Z\däöüÄÖÜ]+(?:\.(?!.*\.))?(?:-(?!.*-)|[ ]{0,1}))+
我将使用'博士将其分解Aaryan Joshi'就是一个例子。
[]中包含的任何内容都是我们所说的'字符捕获组'。这意味着捕获任何这些角色。
首先,暂时忽略任何'?:'..留下我们([a-zA-Z \däöüÄÖÜ - ] +(\。(?!。*。))?[] {0,1 })+
所以,[a-zA-Z \däöüÄÖÜ-]我们说:
通过添加+,我们会说'1或更多'。
这只会匹配'Dr',因为我们还没有接受句号或空格字符。
接下来我们添加(\。(?!。* \。))?意思是: - 匹配任何。 (\。)不后跟另一个。 (?!(\)。) - 我们将其括在括号中,然后是?这意味着'你不必总是匹配这个'..即可以或不能'是'',但如果有,请确保它是唯一的。
现在我们匹配'博士'但如果还有另一个'我',我们就不会匹配它。更进一步。
接下来,我们为space []添加另一个字符捕获组,并使用{,}表示法来指示'bounds'。所以[] {0,1}表示'匹配0或1空格'(另一种表示法是使用?符号,例如[]?或简单地说'?'..但{0,1}更明确
这将匹配'博士”。
最后一步是表明我们想捕获多个此实例。所以我们将它们全部包含在括号中,并使用+表示我们想要捕获这些中的“1个或更多”。
现在匹配整个字符串'博士Aaryan Joshi'
最后,我们在所有捕获组中添加“?:”,表示我们只匹配模式,并且不希望存储对匹配组的引用(节省内存:))
除了@AlanMoore的评论之外,你当然也可以像这样添加这个正则表达式的锚点
^(?:[a-zA-Z\däöüÄÖÜ]+(?:\.(?!.*\.))?(?:-(?!.*-)|[ ]{0,1}))+$
如果您想为接受的字符数量设置最小限制,请将第一个加号更改为绑定.. ex {3,}以表示“3或更多”。
希望这会有所帮助:)
注意我已根据您提供的验收标准对所有这些进行了测试,并且它符合使用JavaScript正则表达式引擎时的所有情况:)
修改将\w
交换为a-zA-Z\d
,因为\w
也会接受_
字符(感谢@AlanMoore指出这一点)
答案 4 :(得分:0)
试试这个(在JavaScript中,与上面的评论相符)
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
// All "true"
alert(test("Dr. Aaryan Joshi"));
alert(test("Phill Rozer MSc."));
alert(test("Ajay Verma5"));
alert(test("Rajan-Verma MSc."));
// All "false"
alert(test("Ajay Verma"));
alert(test("Dr. Ajay. Verma."));
alert(test("Test Name.-.Name2"));
function test( name ) {
var pattern = /^(?=[^.]*\.?[^.]*$)(?!.* $)([A-Za-z0-9äöüÄÖÜ.-]+( |$))+$/;
/*
* (?=[^.]*\.?[^.]*$)
* - Contains zero or one dots (.)
* (?!.* $)
* - Does not end with a space (as in stema's answer)
* ([A-Za-z0-9äöüÄÖÜ.-]+( |$))
* - Matches chars specified, ending with one space or end of string
*
* (Whole pattern is anchored to start & end of string too)
*/
return pattern.test(name);
}
</script>
</head>
<body>
</body>
</html>
答案 5 :(得分:0)
/^(([\wäöüÄÖÜ]+|[\wäöüÄÖÜ]+\-[\wäöüÄÖÜ]+)\.?\s?)+$/.test(yourString)
答案 6 :(得分:0)
/^(?=[^.]+(?:\.[^.]*)?$)(?=[^-]+(?:-[^-]*)?$)[A-Za-z0-9äöüÄÖÜ.-]+(?:[ ][A-Za-z0-9äöüÄÖÜ.-]+)*$/
这些是我理解的标准:
'.'
),除了开头之外,它可以在任何地方。'-'
),同上。[A-Za-z0-9äöüÄÖÜ]
集中的任意数量的字母数字字符。也就是说,如果有任何(规则4),则必须在开始时(规则1)至少有一个字母数字,并且每个空格后至少有一个字母数字。这是正则表达式的细分:
^
(?=[^.]+(?:\.[^.]*)?$) # at most one dot, not at the beginning
(?=[^-]+(?:-[^-]*)?$) # at most one hyphen, ditto
[A-Za-z0-9äöüÄÖÜ.-]+ # first "word"
(?:
[ ] # space presaging another "word"
[A-Za-z0-9äöüÄÖÜ.-]+ # the next "word"
)*
$
答案 7 :(得分:0)
这项工作对我来说
^[a-zA-Z0-9äöüÄÖÜ\-]+\.?.[a-zA-Z0-9äöüÄÖÜ\-]+(.[a-zA-Z0-9äöüÄÖÜ\-]+)?\.?$
记得在javascript之前和之后使用斜杠