使用正则表达式重新格式化文本

时间:2011-06-22 00:59:41

标签: ruby regex

有没有办法使用正则表达式重新格式化字符串?

我有一个像AEY4293这样的字符串,我希望在字母和数字之间添加一个短划线,例如AEY-4293

我试图找到像s/pattern/replacement/这样的东西,但我找不到它。

我可以使用/(\w+)(\d+)/选择块,所以如果我可以给模式重新格式化\1-\2这样的文本,那就太棒了。

谢谢!

5 个答案:

答案 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等引用的刺痛。