我正在努力寻找能够满足这条规则的正则表达式:
该单词可以包含任何英文字母字符,撇号和单个连字符,但不接受双连字符。
所以这些都很好:
o'clock
brother-in-law
但这不是:
stack--overflow
这是我到目前为止所得到的:
^[a-zA-Z\']*\-?$
如果连字符位于字符串的末尾,但显然不是字符串中的任何位置,它将起作用。
提前致谢, 路加
答案 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