下划线或连字符的正则表达式模式,但不是两者

时间:2017-03-30 19:27:40

标签: regex

我有一个正则表达式,允许字符串是独立的,用连字符和下划线分隔。

我需要帮助,所以字符串只使用连字符或下划线,但不能同时使用。

这是我到目前为止所做的。

^([a-z][a-z0-9]*)([-_]{1}[a-z0-9]+)*$

foo             = passed
foo-bar         = passed
foo_bar         = passed
foo-bar-baz     = passed
foo_bar_baz     = passed
foo-bar_baz_qux = passed # but I don't want it to
foo_bar-baz-quz = passed # but I don't want it to

2 个答案:

答案 0 :(得分:4)

您可以稍微扩展模式并使用反向引用仅匹配相同的分隔符:

l = [ dict(zip(['Long', 'Lat'],c['Shape'][1:-1].split(',') if len(c['Shape'])>0 else ['',''] ))  for c in d]

请参阅regex demo

<强>详情:

  • ^[a-z][a-z0-9]*(?:([-_])[a-z0-9]+(?:\1[a-z0-9]+)*)?$ - 字符串开头
  • ^ - 后跟0 +小写字母或数字的字母
  • [a-z][a-z0-9]* - 可选序列:
    • (?:([-_])[a-z0-9]+(?:\1[a-z0-9]+)*)? - 捕获与([-_])-
    • 匹配的第1组
    • _ - 1个小写字母或数字
    • [a-z0-9]+ - 0+序列:
      • (?:\1[a-z0-9]+)* - 与第1组相同的值
      • \1 - 一个或多个小写字母或数字
  • [a-z0-9]+ - 字符串结束。

答案 1 :(得分:3)

这是一个很好的清洁解决方案:

^([a-zA-Z-]+|[a-zA-Z_]+)$

分解!

  • ^从文字开头
  • 开始
  • [a-zA-Z-]+匹配任何a-zA-Z-
  • |或运营商
  • [a-zA-Z_]+匹配任何a-zA-Z_
  • $在文字末尾结束

Here's an example on regexr!