regex - 当单词与数字相邻时使用单词边界
问题描述
我对正则表达式非常缺乏经验,所以请多多包涵。我的程序检查用户输入中的测量单位,并将它们从公制转换为英制,反之亦然。这是我的案例陈述的片段:
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
例如。有没有办法制作一个忽略相邻数字的单词边界?
解决方案
因为左边的字边界也可以写成,(?<!\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?
-tr
或trs
|
- 或者it(?:er|re)s?
-it
后跟er
orre
然后是可选的s
(?![^\W\d])
/(?![\w&&[^\d]])
- 紧随其后,不能有除非单词或数字字符以外的字符(\d
排除的尾随单词边界)
该i
标志将使正则表达式不区分大小写。
推荐阅读
- c - 如何管理符号表中的范围
- swift - 创建一个自定义视图并在情节提要中使用它
- php - codeigniter中的锚标记在单击时不断重新加载页面
- arrays - Hive中Presto UNNEST函数的等价物是什么
- php - update_term_meta() 没有按预期工作
- predicate - 谓词未在 foreach 循环中堆叠
- php - 表结构 PHP 矩阵网格
- c# - 如何在异步环境中正确使用 Fire&Forget
- prometheus - Prometheus - 匹配除一个以外的所有指标
- laravel - Spatie 媒体库 - 当前请求在名为 `pic` 的键中没有文件