寻找与 Ruby 中的#gsub 一起使用的正则表达式,以去除字符串中除序数之外的所有数字。假设以下内容可以在字符串中保留我想要的内容:
string = "100 red balloons"
strip_digits = string.gsub(/[^a-zA-Z\s]/, '')
=> " red balloons"
如果满足以下条件,我将如何修改 strip_digits 中的正则表达式:
string = "50th red balloon"
strip_digits 会返回:
=> "50th red balloon"
也就是说,正则表达式会忽略属于序数的数字,同时匹配其他数字。
对于此示例,可以安全地假设紧跟序数指示符(“nd”、“th”、“rd”或“st”)的任何数字串是序数.
最佳答案
作为正则表达式的“修复”,我建议:
input.gsub(/(\d+(?:th|[rn]d|st))|[^a-z\s]/i, "\\1")
逻辑是这样的:将序数后缀的所有数字匹配捕获到第1组,然后用替换模式中的\1
反向引用恢复这个值,再匹配(删除)所有带有[^a-z\s]
(或[^\p{L}\s]
)的非字母和非空格。
图案细节:
(\d+(?:th|[rn]d|st))
- 第 1 组匹配 1+ 个数字 (\d+
) 后跟th
、rd
、nd
或st
(所有子字符串都存储在编号缓冲区 #1 中,当\1
反向引用用于替换模式)|
- 或[^a-z\s]
- ASCII 字母以外的字符(由于/i
不区分大小写修饰符,所有小写和大写字母都匹配)和空格(为避免删除 Unicode 字母,请使用\p{L}
而不是a-z
)。
关于ruby - 正则表达式去除除序数以外的所有数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37104666/