【问题标题】:Regex: Any word and numeric combination but with a single underscore正则表达式:任何单词和数字组合,但只有一个下划线
【发布时间】:2016-12-12 23:28:25
【问题描述】:

如果它包含字母或数字或单个下划线序列,我想匹配整个字符串,所以:

接受:

  • H_i_there
  • _this_is_OK_
  • _x_y_5_z
  • abddd_cdxxx

不接受:

  • s___2
  • __s__t__2
  • __x____x4

因此,不允许使用多个连续的下划线。正则表达式如何查找这个?我的版本是:^[a-zA-Z0-9]+\_{0,1}[a-zA-Z0-9]+\_{0,1}$,但这必须是递归的,不知何故,它才能工作,而且 AFAIK,正则表达式不支持如此复杂的功能。

【问题讨论】:

  • 当我需要计算模式中的特定字符时,我更喜欢避免使用正则表达式。你用的是什么工具?这可以使用几乎任何语言轻松完成。
  • @MarounMaroun 我同意,但是正则表达式更简洁,如果它可以为我做,那就完美了:)

标签: regex


【解决方案1】:

你可以使用

^_?[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*_?$

regex demo

详情

  • ^ - 字符串开头
  • _? - 一个可选的_
  • [a-zA-Z0-9]+ - 1+ 个字母数字字符
  • (?:_[a-zA-Z0-9]+)* - 0+ 个序列:
    • _ - 1 个下划线
    • [a-zA-Z0-9]+ - 1+ 个字母数字字符
  • _? - 一个可选的_
  • $ - 字符串结束

一种效率较低但较短的模式:

^(?:_?[a-zA-Z0-9]+)*_?$

this demo

【讨论】:

  • 仅供参考,你不想要一个 recursive 正则表达式,只是一个 repetitive 模式和一个“重复”非捕获组 (@987654335 @) 在这里非常方便。如果您希望_ 至少出现一次,您可以添加一个积极的前瞻:^(?=[^_]*_)_?[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*_?$
  • 不需要开头:^(?:_?[a-zA-Z0-9])+_?$ 完全一样
  • 你的意思是 Wiktor 在第二个正则表达式中写的?
  • @Christoph:不,不一样,涉及更多的回溯。我提到它时说第二个正则表达式效率较低。尽管人们通常喜欢较短的模式,但量化可选的分组模式并不是一个好主意。徒劳:较短的正则表达式并不总是意味着更有效的正则表达式。
  • @WiktorStribiżew 如果您追求性能,请不要首先使用回溯正则表达式实现。
【解决方案2】:

您可以使用lookahead 来禁止__

^(?!.*?__)\w+$

See demo at regex101

\w 匹配一个单词字符 [A-Za-z0-9_](包括下划线)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2010-09-25
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多