下划线前后的正则表达式匹配字符

时间:2016-07-21 07:50:58

标签: javascript regex

我必须在匹配后写一个正则表达式:

  • 字符串应以字母开头 - [a-zA-Z]
  • 字符串可以包含字母,空格,数字,_-(下划线和连字符)
  • 字符串不应以_-(下划线和连字符)结尾
  • 下划线角色前后不应有空格。

我提出了以下正则表达式,但它似乎无法正常工作

/^[a-zA-Z0-9]+(\b_|_\b)[a-zA-Z0-9]+$/

测试案例

HelloWorld // Match
Hello_World //Match
Hello _World // doesn't match
Hello_ World // doesn't match
Hello _ World // doesn't match
Hello_World_1 // Match
He110_W0rld // Match
Hello - World // Match
Hello-World // Match
_HelloWorld // doesn't match
Hello_-_World // match

4 个答案:

答案 0 :(得分:8)

您可以使用

^(?!.*(?:[_-]$|_ | _))[a-zA-Z][\w -]*$

请参阅regex demo

解释

  • ^ - 字符串开头
  • (?!.*(?:[_-]$|_ | _)) - 在某些字符(.*)之后,字符串末尾不得显示(?!...)_- [_-]$ 1}}),也不是空格+ __ +空间
  • [a-zA-Z] - 匹配和使用的第一个字符必须是ASCII字母
  • [\w -]* - 0+字(\w = [a-zA-Z0-9_])字符或空格或-
  • $ - 字符串结尾

答案 1 :(得分:2)

你可以使用这个:

^(?!^[ _-]|.*[ _-]$|.* _|.*_ )[\w -]*$

regex tester

对于测试用例,我使用修饰符gm分别匹配每一行。

如果不应将emtpy字符串视为可接受,请将最终*更改为+

^(?!^[ _-]|.*[ _-]$|.* _|.*_ )[\w -]+$

每个部分的含义

  • ^$匹配输入的开头/结尾
  • (?! )匹配的内容列表:
    • |:逻辑或
    • ^[ _-]:以这三个字符中的任何一个开头
    • .*[ _-]$:以这三个字符中的任何一个结尾
    • .* _:空格后面跟下划线
    • .*_:有下划线后跟空格
  • [\w -]:任何字母数字字符或下划线(也与\w匹配)或空格或连字符
  • *:零次或多次
  • +:一次或多次

答案 2 :(得分:1)

这个怎么样?

^[a-zA-Z](\B_\B|[a-zA-Z0-9 -])*[a-zA-Z0-9 ]$

细分:

^               
[a-zA-Z]        allowed characters at beginning
(
 \B_\B          underscore with no word-boundary
|                 or
 [a-zA-Z0-9 -]  other allowed characters
)*
[a-zA-Z0-9 ]    allowed characters at end
$

答案 3 :(得分:0)

哦!我爱我一些正则表达式!

这会有用吗? /^[a-z]$|^[a-z](?:_(?=[^ ]))?(?:[a-z\d -][^ ]_[^ ])*[a-z\d -]*[^_-]$/i

我有点不确定规则4 - 你的意思是下划线可以在之后之前有空格,但不能在之后?