在单词中的任何位置匹配零个或一个特定字符

时间:2015-07-06 07:49:41

标签: regex

我正在努力寻找能够满足这条规则的正则表达式:

该单词可以包含任何英文字母字符,撇号和单个连字符,但不接受双连字符。

所以这些都很好:

o'clock
brother-in-law

但这不是:

stack--overflow

这是我到目前为止所得到的:

^[a-zA-Z\']*\-?$

如果连字符位于字符串的末尾,但显然不是字符串中的任何位置,它将起作用。

提前致谢, 路加

2 个答案:

答案 0 :(得分:2)

你可以试试这个,

^(?!.*--)[A-Za-z'-]+$

但如果您不喜欢'',则可以使用以下内容。

^(?!.*(?:--|''))[A-Za-z'-]+$

答案 1 :(得分:1)

我认为你可以使用一个没有任何前瞻的简单正则表达式:

^[A-Za-z']+(?:[-'][A-Za-z]+)*$

请参阅demo

<强>解释

  • ^ - 字符串开头
  • [A-Za-z']+ - 一个或多个英文字母或'
  • (?:[-'][A-Za-z]+)* - 匹配0次或更多次的非捕获组
    • [-'] - 连字符或撇号
    • [A-Za-z]+ - 一个或多个英文字母
  • $ - 字符串结尾

<强>更新

如果开头有'-,则&#34;字&#34;可以用连字符结束,你可以使用:

^-?[A-Za-z']+(?:-['A-Za-z]+)*-?$

<强>解释

  • ^ - 字符串开头
  • -? - 可选连字符
  • [A-Za-z']+ - 一个或多个字母或撇号
  • (?:-['A-Za-z]+)* - 匹配0次或更多次序列的非捕获组
    • - - 连字符
    • ['A-Za-z]+ - 一个或多个撇号或字母
  • -? - 可选连字符在...
  • $ - 字符串结束。

使用案例忽略选项/i,您还可以将其缩短为

/^-?[a-z']+(?:-['a-z]+)*-?$/i

请参阅another demo