当单词与数字相邻时使用单词边界

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

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),0.264172,1000)} milliliter(s)!"

我想将第一个when更改为也包含/l/。为防止它与其他l条件下(例如when中的gallon混合出现,我想使用类似/\bl\b/的东西。问题是,这使得程序无法识别l(如果它与数字相邻),例如20L。有没有办法使单词边界忽略相邻数字?

fuying58 回答:当单词与数字相邻时使用单词边界

由于左单词边界也可以写为(?<!\w),右单词边界也可以写成(?!\w),所以您要做的就是从中减去\d。 / p>

您可以使用它

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

或使用character class intersection

(?<![\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

请参见regex demo #1regex demo #2

详细信息

  • (?<![^\W\d]) / (?<![\w&&[^\d]])-在此之前,除了非单词或数字字符(不能包含\d的前导词边界)之外,不能有其他字符
  • l-一封l字母
  • (?:trs?|it(?:er|re)s?)?-可选序列:
    • trs?-trtrs
    • |-或
    • it(?:er|re)s?-it后跟erre,然后是可选的s
  • (?![^\W\d]) / (?![\w&&[^\d]])-之后,除非单词或数字字符外,不能再有其他字符(不包括\d的结尾词边界)

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

,

(?<=\d|\b)L(?=\d|\b)

您可以使用肯定的环视方法来断言,在L的旁边是单词边界或数字。

  • (?<=\d|\b)断言,在模式正前方有数字或单词边界。
  • L匹配L
  • (?=\d|\b)断言,在模式之后立即有数字或单词边界。

通过使用环顾四周,您可以断言某些事物的存在而不匹配它。这样,您就可以验证数字的存在,而无需在正则表达式中实际使用它们。

Demo

本文链接:https://www.f2er.com/3137309.html

大家都在问