首页 > 解决方案 > 当单词与数字相邻时使用单词边界

问题描述

我对正则表达式非常缺乏经验,所以请多多包涵。我的程序检查用户输入中的测量单位,并将它们从公制转换为英制,反之亦然。这是我的案例陈述的片段:

when /ltr|ltrs|liter|liters|litre|litres/
      puts "#{int} liter(s) is equal to #{calc(int, 3.78541)} gallon(s), #{rem(int, 3.78541, 4)} quart(s)!"
when /gal|gals|gallon|gallons/
      puts "#{int} gallon(s) is equal to #{calc(int, 0.264172)} liter(s), #{rem(int, 0.264172, 1000)} milliliter(s)!"

我想将第一个更改when为也包括/l/. 为了防止它与l' 在其他when条件下(例如 in gallon)的存在混淆,我想使用类似/\bl\b/. 问题是这使得程序无法识别l它是否与数字相邻,20L例如。有没有办法制作一个忽略相邻数字的单词边界?

标签: regexruby

解决方案


因为左边的字边界也可以写成,(?<!\w)而右边的边界也可以写成,(?!\w)你需要做的就是从中减去 a \d

您也可以使用它

(?<![^\W\d])L(?![^\W\d])

或与字符类交集

(?<![\w&&[^\d]])L(?![\w&&[^\d]])

整个正则表达式看起来像/(?<![^\W\d])(?:<your_regex>)(?![^\W\d])/i

/(?<![^\W\d])l(?:trs?|it(?:er|re)s?)?(?![^\W\d])/i
/(?<![\w&&[^\d]])l(?:trs?|it(?:er|re)s?)?(?![\w&&[^\d]])/i

请参阅正则表达式演示 #1正则表达式演示 #2

细节

  • (?<![^\W\d])/ (?<![\w&&[^\d]])- 就在之前,不能有除非单词或数字字符以外的字符(\d排除的前导词边界)
  • l-l一封信
  • (?:trs?|it(?:er|re)s?)?- 可选序列:
    • trs?-trtrs
    • |- 或者
    • it(?:er|re)s?-it后跟erorre然后是可选的s
  • (?![^\W\d])/ (?![\w&&[^\d]])- 紧随其后,不能有除非单词或数字字符以外的字符(\d排除的尾随单词边界)

i标志将使正则表达式不区分大小写。


推荐阅读