有没有办法使用正则表达式重新格式化字符串?
我有一个像AEY4293
这样的字符串,我希望在字母和数字之间添加一个短划线,例如AEY-4293
。
我试图找到像s/pattern/replacement/
这样的东西,但我找不到它。
我可以使用/(\w+)(\d+)/
选择块,所以如果我可以给模式重新格式化\1-\2
这样的文本,那就太棒了。
谢谢!
答案 0 :(得分:2)
'AEY4293'.sub(/(?<=\w)(?=\d)/, '-')
您也可以
'AEY4293'.sub(/(?=\d)/, '-')
接近mu是太短的答案。
答案 1 :(得分:2)
irb(main):001:0> "AEY4293".sub(/(\D+)(\d+)/, '\1-\2')
=> "AEY-4293"
答案 2 :(得分:1)
正则表达式将是:
/([A-Z]+)(\d+)/
替换模式将是:
\1-\2
表达式/(\w+)(\d+)/
存在问题,因为\w
匹配alpha和数字。
因此,使用输入AEY4293
,\w+
将匹配AEY429
,\d+
将匹配尾随3
。
答案 3 :(得分:1)
如果非数字前缀总是三个字符,那么您可以在没有正则表达式的情况下执行此操作:
s = 'AEY4293'
s[3,0] = '-'
# s is now 'AEY-4293'
或者,如果您希望在前缀大小上有一点灵活性,可以使用index
结合上述内容:
s[s.index(/\d/), 0] = '-'
我喜欢这个括号分配符号,因为它与你的意图很好地匹配。
答案 4 :(得分:0)
有一种str.sub(pattern, replacement)
方法。替换是\1
等引用的刺痛。