需要一个带有1个连字符的字母数字的正则表达式和单词之间的空格

时间:2012-08-02 18:20:08

标签: regex

你能给我一个正常的表达吗

  • 仅允许使用字母数字
  • 在整个字符串中绝对只有一个连字符
  • 字符串正面和背面不允许使用连字符或空格
  • 不允许连续的空格或连字符。
  • hypen和一个空间可以彼此靠近

有效 - “123-Abc test1”,“test-m e”,“abc slkh-hsds”
无效 - “abc”,“ - hsdj sdsd hjds-”

感谢您帮助我。非常感谢您的帮助

3 个答案:

答案 0 :(得分:3)

/^([a-zA-Z0-9] ?)+-( ?[a-zA-Z0-9])+$/

请在此处查看demo

修改

如果连字符的两个侧面都没有空格,那么还需要更多:

/^([a-zA-Z0-9] ?)+-(((?<! -) )?[a-zA-Z0-9])+$/
                    ^^^^^^^^ ^

或者,如果不支持负面的lookbehind断言(例如在JavaScript中),那么等效的正则表达式:

/^([a-zA-Z0-9]( (?!- ))?)+-( ?[a-zA-Z0-9])+$/
              ^ ^^^^^^^ ^

答案 1 :(得分:2)

  1. 只包含字母数字(包括连字符和空格,否则没有意义):

    ^[\da-zA-Z -]+$
    

    这是匹配字符串的主要部分,并确保每个字符都在给定的集合中。即数字和ASCII字母以及空格和连字符(以下部分将限制其使用)。

  2. 字符串的开头或结尾只有一个连字符和无:

    (?=^[^-]+-[^-]+$)
    

    这是一个先行断言,确保字符串以至少一个非连字符开头和结尾。中间需要一个连字符。

  3. 开头或结尾没有空格或字符串:

    (?=^[^ ].*[^ ]$)
    

    再次前瞻,类似于上面的那个。它们可以组合成一个,但看起来更麻烦,更难以解释。

  4. 没有连续的空格(上面已经排除了连续的连字符):

    (?!.*  )
    
  5. 全部放在一起:

    (?!.*  )(?=^[^ ].*[^ ]$)(?=^[^-]+-[^-]+$)^[\da-zA-Z -]+$
    

    快速PowerShell测试:

    PS> $re='(?!.*  )(?=^[^ ].*[^ ]$)(?=^[^-]+-[^-]+$)^[\da-zA-Z -]+$'
    PS> "123-Abc test1","test- m e","abc slkh-hsds"," abc ", " -hsdj sdsd hjds- " -match $re
    123-Abc test1
    test- m e
    abc slkh-hsds
    

答案 2 :(得分:1)

使用此正则表达式:

^(.+-.+)[\da-zA-Z]+[\da-zA-Z ]*[\da-zA-Z]+$