如何仅使用ruby regexp删除一个组?

时间:2016-09-26 18:59:23

标签: ruby regex pattern-matching gsub

我尝试使用ruby gsub方法从字符串中删除模式。给出以下字符串:

ANTONIO JUAREZ HAMPEL SCHLICH- TING

我只需删除行尾的连字符并将字符串转换为单行,如ANTONIO JUAREZ HAMPEL SCHLICHTING。我试过了:

name = <<-TEXT
  ANTONIO JUAREZ HAMPEL SCHLICH-
  TING
TEXT

name.gsub(/[a-zA-Z](\-\n)/, '')

但它不起作用。 gsub应该在任何非数字字符((\-\n))之后立即删除[a-zA-Z]

在这里搜索,在SO,我通过this question计算出gsub忽略正则表达式组并替换所有模式。有没有选择使用ruby中的gsub,或者使用这种方法以不同的方式我可以实现这个结果?

5 个答案:

答案 0 :(得分:2)

name.gsub!(/(?<=[A-Za-z])-\n\s*/, '')

&#34;替换短划线,换行符和任意数量的以字母开头的空格,没有任何内容&#34;

后卫((?<=...))不被视为比赛的一部分。或者,您可以捕获捕获组中的字母,然后将其重新插入替换中,但它不那么优雅。

答案 1 :(得分:1)

出于好奇:

▶ name = <<-TEXT
▷   ANTONIO JUAREZ HAMPEL SCHLICH-
▷   TING
▷ TEXT
#⇒ "  ANTONIO JUAREZ HAMPEL SCHLICH-\n  TING\n"
▶ name.split(/-\n\s*/).join
#⇒ "  ANTONIO JUAREZ HAMPEL SCHLICHTING\n"

或者,为了摆脱前导/尾随空格:

▶ name.split(/-\n/).map(&:strip).join
#⇒ "ANTONIO JUAREZ HAMPEL SCHLICHTING"

答案 2 :(得分:1)

为什么你认为必须使用正则表达式?

name.split('-').map(&:strip).join
  #=> "ANTONIO JUAREZ HAMPEL SCHLICHTING"

答案 3 :(得分:0)

试试这个:

your_string.gsub!(/-\n\s*/, '')
#=> "ANTIONO JUAREZ HAMPEL SCHLITICH\n"

答案 4 :(得分:0)

试试这个:

name = <<-TEXT
  ANTONIO JUAREZ HAMPEL SCHLICH-
  TING
TEXT


puts name.gsub(/^\s+/,'').gsub(/(?<=[a-zA-Z])(\-\n)/,'')

输出:

ANTONIO JUAREZ HAMPEL SCHLICHTING