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

Regex 当单词与数字相邻时使用单词边界,regex,ruby,Regex,Ruby,我对正则表达式非常缺乏经验,所以请容忍我。我的程序检查用户输入的测量单位,并将其从公制转换为英制,反之亦然。以下是我的案例陈述的一个片段: 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/

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

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)!"

我想更改第一个,何时也包括/l/。为了防止它和l在其他情况下的存在相混淆,比如在加仑的情况下,我想使用类似/\bl\b/的东西。问题是,这使得程序无法识别与数字相邻的l,例如在20L中。有没有一种方法可以创建忽略相邻数字的单词边界?

??,因为左边的单词边界也可以写为?右边的边界可以写成\只需从中减去a\d即可

你也可以用它

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

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

请参阅和

细节

? / ? - 就在前面,除了非字字符或数字字符之外,不能有一个字符作为前导字边界,\d被排除在外 字母 ?:trs?| it?:er | res??-一个可选的序列: trs?-tr或trs |-或 它?:呃| res——它后跟er或re,然后是可选的s ?![^\W\d]/?![\w&&[^\d]]-紧跟其后的字符不能是非单词字符或数字字符,后面的单词边界不包含\d
i标志将使regex不区分大小写。

因为左单词边界也可以写为?右边的边界可以写成\只需从中减去a\d即可

你也可以用它

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

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

请参阅和

细节

? / ? - 就在前面,除了非字字符或数字字符之外,不能有一个字符作为前导字边界,\d被排除在外 字母 ?:trs?| it?:er | res??-一个可选的序列: trs?-tr或trs |-或 它?:呃| res——它后跟er或re,然后是可选的s ?![^\W\d]/?![\w&&[^\d]]-紧跟其后的字符不能是非单词字符或数字字符,后面的单词边界不包含\d
i标志将使正则表达式不区分大小写。

谢谢,这非常有效。我不知道什么是环顾汉克,这很有效。我不知道什么是环顾四周你把你的问题放在你想解决的问题上。相反,你需要陈述你希望实现的目标。可以假设,您希望匹配多个字符串中的一个,前提是该字符串前面不紧跟X,后面也不紧跟Y。您需要告诉我们X和Y是什么。我问的是如何匹配特定字符串,例如,l,即使它可能直接跟在数字后面,例如。,如果恰好是另一个字符串(例如加仑)的一部分,则20升无另一个条件也与之匹配。我正在尝试更好地使用regex,这是我使用特定于regex的解决方案构建它的方式。抱歉,我的问题不清楚。哦,那么您希望“1.2.3gal”是匹配的,而不是“10gal2”?我希望在第一个when条件中匹配字符串,而在第二个when条件匹配相同字符串时不匹配字符串,因为它包含在第二个when条件尝试匹配的字符串中。同时,我希望它匹配,即使它可能直接跟在一个数字后面-特别是因为它是一个限制,当使用类似于\b此处字符串\b的东西时,尽管您的建议也会很有用,因为您知道您已经根据您想解决的问题提出了您的问题。相反,你需要陈述你希望实现的目标。可以假设,您希望匹配多个字符串中的一个,前提是该字符串前面不紧跟X,后面也不紧跟Y。您需要告诉我们X和Y是什么。我问的是如何匹配特定字符串,例如,l,即使它可能直接跟在数字后面,例如。,如果恰好是另一个字符串(例如加仑)的一部分,则20升无另一个条件也与之匹配。我正在尝试更好地使用regex,这是我使用特定于regex的解决方案构建它的方式。抱歉,我的问题不清楚。哦,那么您希望“1.2.3gal”是匹配的,而不是“10gal2”?我希望在第一个when条件中匹配字符串,而在第二个when条件匹配相同字符串时不匹配字符串,因为它包含在第二个when条件尝试匹配的字符串中。同时,我希望它匹配,即使它可能直接跟在一个数字后面-特别是因为它在使用类似\b此处字符串\b时是一个限制,尽管您的建议也很有用
/(?<![^\W\d])l(?:trs?|it(?:er|re)s?)?(?![^\W\d])/i
/(?<![\w&&[^\d]])l(?:trs?|it(?:er|re)s?)?(?![\w&&[^\d]])/i