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

Regex 在单词中的任意位置匹配零个或一个特定字符,regex,Regex,我正在努力寻找一个正则表达式来满足这个规则: 单词可以包含任何英文字母字符、撇号和单连字符,但不接受双连字符 所以这些都很好: o'clock brother-in-law 但这不是: stack--overflow 到目前为止,我得到的是: ^[a-zA-Z\']*\-?$ 如果连字符位于字符串的末尾,但显然不是我所需要的字符串中的任何位置,那么它将起作用 提前感谢,, 卢克你可以试试这个 ^(?!.*--)[A-Za-z'-]+$ 但这允许”如果您不喜欢,请使用以下选项 ^(?!.*

我正在努力寻找一个正则表达式来满足这个规则:

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

所以这些都很好:

o'clock
brother-in-law
但这不是:

stack--overflow
到目前为止,我得到的是:

^[a-zA-Z\']*\-?$
如果连字符位于字符串的末尾,但显然不是我所需要的字符串中的任何位置,那么它将起作用

提前感谢,, 卢克你可以试试这个

^(?!.*--)[A-Za-z'-]+$
但这允许
如果您不喜欢,请使用以下选项

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

我认为您可以只使用简单的正则表达式,而不使用任何lookaheads:

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

说明

  • ^
    -字符串的开头
  • [A-Za-z']+
    -1个或多个英文字母或A
    '
  • (?:[-'][A-Za-z]+)*
    -与0次或多次出现的
    • [-']
      -连字符或撇号
    • [A-Za-z]+
      -1个或多个英文字母
  • $
    -字符串结尾
更新

如果开头既有
又有
-
,并且“单词”可以以连字符结尾,则可以使用:

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

  • ^
    -字符串的开头
  • -?
    -可选连字符
  • [A-Za-z']+
    -1个或多个字母或撇号
  • (?:-['A-Za-z]+)*
    -一个非捕获组,与序列的0倍或更多倍相匹配
    • -
      -连字符
    • ['A-Za-z]+
      -1个或多个撇号或字母
  • -?
    -在
  • $
    -字符串结束
使用案例忽略选项
/i
,您还可以将其缩短为

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

请参见

也将匹配。可以吗?如果你不想在一开始就允许hypen
^(?。*(?:-|“”)[A-Za-z'-]+$
我认为这实际上很好@Stribizev,但是谢谢你在编辑后提供的额外答案,这也很好,非常感谢:)是的,我知道,有时候,比比比比比比比比比比比比比比比比比比比比比比比比比比比比好。@Jonny5:现在,我没有环顾四周就成功了。无论什么时候,只要有一条路没有它们,我就更喜欢那条路。斯特里比雪夫的优势是什么?速度简单我需要它来配摇滚乐way@LukeBenting:是的,性能。既然你说可以使用连续撇号,我想你可以试试。或者,如果您的“单词”可以以连字符结尾,您可以尝试。您是否一定要使用单个正则表达式来确保字符串包含字母、撇号和单个连字符?首先确保这些字符的存在,然后测试是否有连续的连字符,这样会更简单、更快。@Jerry:我更愿意,只是为了让代码更干净一点,你为什么不建议这样做?性能?性能和可读性。可靠性是因为。。。如果没有解释的话,你能告诉我下面的正则表达式实际上是怎么做的吗?下一个接替您的人(在业务环境中)会怎样?如果有更高的限制,他们是否能够修改代码?