【问题标题】:Find a string of multiplicy length找到一个倍数长度的字符串
【发布时间】:2015-09-02 17:36:23
【问题描述】:

我必须找到长度为 7 的倍数且小于 35 的每个单词。我可以使用一些类似

的模式
/\b([a-zA-Z0-9]{7}|[a-zA-Z0-9]{14}|[a-zA-Z0-9]{21}|[a-zA-Z0-9]{28})\b/

但我希望有更好的解决方案,例如

[a-zA-Z0-9]{7|14|21|28} 

甚至喜欢

[a-zA-Z0-9]{7*k}

【问题讨论】:

  • 使用一到五个重复的一组恰好七个字符。
  • @JonathanLeffler 没看懂,能不能写个代码示例?
  • 就像@bro 刚刚写的答案一样。我宁愿不在 iPad 键盘上输入正则表达式;很痛苦。
  • 这里必须使用正则表达式吗?如果这不是作业,我肯定会使用String#scan#split
  • @JonathanLeffler 谢谢!

标签: ruby regex validation


【解决方案1】:

这样的事情应该可以解决问题

/\b(?:[a-zA-Z0-9]{7}){1,5}\b/

匹配长度为 7,14,21,28,35 的字符串

演示:https://regex101.com/r/eO4oG3/2

编辑:另一种可能性是使用反向引用
http://www.regular-expressions.info/backref.html

【讨论】:

  • 这似乎不适用于长度为 14 的单词,除了第一个实例
【解决方案2】:

这个应该可以工作:

\b([[:alnum:]]{7}){1,5}\b

它匹配[A-Za-z0-9] 类的每个字符、length 7 的每个子词及其与5 的乘积。

例如

12345672234567
abcdefghijklmn

但不是12345678

编辑 将 \w 替换为 [[:alnum]] 因为此 POSIX 类仅包含字母和数字。

【讨论】:

  • 问号有什么好处?如果省略它,它的工作原理是否相同?
  • 是的,?这里不需要,我的错,我把它拿出来。下划线,我不知道:/
【解决方案3】:

假设您在非单词字符上分词(如果在空格上分词,请使用String#split):

text.scan(/\w+/).select { |word| [7, 14, 21, 28].include?(word.size) }

【讨论】:

    【解决方案4】:

    这是一种更好的方法,也是您可以使用正则表达式获得的最接近的方法。

    (?i)\b(?=[a-z\d]{1,34}\b)(?:[a-z\d]{7})+\b

    以下:'34' 是最大长度变量,'7' 是多因子变量。
    它们相互独立。
    可以在运行时使用任何长度和多重变量值构造它。

     (?i)                         # No case
     \b                           # Word boundary
     (?= [a-z\d]{1,34} \b )       # Max length = 34
     (?: [a-z\d]{7} )+            # Multiple factor = 7
     \b                           # Word boundary
    

    输入:

    length=7  aaaaaaa   
    length=14 bbbbbbbbbbbbbb
    length=21 ccccccccccccccccccccc
    length=28 dddddddddddddddddddddddddddd
    length=35 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    

    输出:

     **  Grp 0 -  ( pos 10 , len 7 ) 
    aaaaaaa  
    
    -------------
    
     **  Grp 0 -  ( pos 32 , len 14 ) 
    bbbbbbbbbbbbbb  
    
    -------------
    
     **  Grp 0 -  ( pos 58 , len 21 ) 
    ccccccccccccccccccccc  
    
    -------------
    
     **  Grp 0 -  ( pos 91 , len 28 ) 
    dddddddddddddddddddddddddddd  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多