需要正则表达式

时间:2011-11-07 07:50:01

标签: javascript jquery regex

我需要编写一个正则表达式,允许标准字符[a-zA-Z0-9]加上每个单词之间的一个空格,变音符号[äöüÄÖÜ],点(.)和连字符({{ 1}})并没有其他特殊字符。

例如:

应该允许以下:

-

不应允许以下内容:

Dr. Aaryan Joshi    
Phill Rozer MSc.    
Ajay Verma5    
Rajan-Verma MSc.

8 个答案:

答案 0 :(得分:7)

试试这个

^(?! )(?!.* $)(?=[^.]*\.?[^.]*$)(?=[^-]*-?[^-]*$)(?!.*? {2,})[a-zA-Z0-9äöüÄÖÜ .-]+$

here on Regexr

^$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äöüÄÖÜ-]我们说:

  • 捕捉任何单词字符(a-zA-Z0-9),任何这些变音符号(äöüÄÖÜ)和任何' - '

通过添加+,我们会说'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äöüÄÖÜ.-]+)*$/

这些是我理解的标准:

  1. 必须以字母或数字开头(包括带有重音的字母)。
  2. 最多只能有一个点('.'),除了开头之外,它可以在任何地方。
  3. 最多可以有一个连字符('-'),同上。
  4. 可以包含任何数字空格,但它们不能位于开头或结尾,并且不能连续。
  5. 只要符合其他条件,就可以包含[A-Za-z0-9äöüÄÖÜ]集中的任意数量的字母数字字符。也就是说,如果有任何(规则4),则必须在开始时(规则1)至少有一个字母数字,并且每个空格后至少有一个字母数字。
  6. 这是正则表达式的细分:

    ^
    (?=[^.]+(?:\.[^.]*)?$)      # 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之前和之后使用斜杠