【问题标题】:Regex to remove non letters正则表达式删除非字母
【发布时间】:2017-06-09 10:58:25
【问题描述】:

我正在尝试从字符串中删除非字母。这样做会不会:

c = o.replace(o.gsub!(/\W+/, ''))

【问题讨论】:

  • 你能稍微描述一下吗,你只想要a-z吗?还是空格和某些符号但不是数字?

标签: ruby regex


【解决方案1】:

gsub! 就足够了:

o.gsub!(/\W+/, '')

注意gsub! 修改了原来的o 对象。另外,如果o不包含任何非单词字符,结果将是nil,所以使用返回值作为修改后的字符串是不可靠的。

你可能想要这个:

c = o.gsub(/\W+/, '')

【讨论】:

  • 啊哈,gsub 修改了原版!这不酷....这样更好吗?我不想修改原来的。复制 = 原件;已转换 = copy.gsub!(/\W+/, '') 返回已转换
  • @newbie:! 版本修改了原来的版本(这就是! 的意思——这是一种“当心,我正在改变你叫我的对象”的标志)。没有! 的版本(在我的第二个代码示例中)可以满足您的要求——它不会就地修改字符串,而是返回应用了替换的副本
【解决方案2】:

删除任何不是字母的内容:

> " sd  190i.2912390123.aaabbcd".gsub(/[^a-zA-Z]/, '')
"sdiaaabbcd"

编辑:正如 ikegami 指出的那样,这没有考虑重音字符、变音符号和其他类似字符。这个问题的解决方案将取决于您所指的“不是字母”。另外,您的输入将是什么。

【讨论】:

  • Zsbán 和 Ævar 要求不同。
  • 希望他们不是这个家伙软件的用户。另一方面,你是对的。
【解决方案3】:

请记住,ruby 将下划线_ 视为单词字符。所以如果你也想保留下划线,应该这样做

string.gsub!(/\W+/, '')

否则,您需要这样做:

string.gsub!(/[^a-zA-Z]/, '')

【讨论】:

    【解决方案4】:

    这适用于大多数情况,除非o 最初不包含任何非字母,在这种情况下gsub! 将返回nil

    如果你只想要一个替换的字符串,它可以更简单:

    c = o.gsub(/\W+/, '')
    

    【讨论】:

      【解决方案5】:

      使用\W\w 仅选择或删除字符将不起作用。 \w 表示 A-Z、a-z、0-9 和“_”:

      irb(main):002:0> characters = (' ' .. "\x7e").to_a.join('')
      => " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
      irb(main):003:0> characters.gsub(/\W+/, '')
      => "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
      

      因此,使用\W 进行剥离会保留数字和下划线。

      如果要匹配字符,请使用/[A-Za-z]+/,或POSIX 字符类[:alpha:],即/[[:alpha:]]+/,或/\p{ALPHA}/

      最终格式是 ASCII 中 'A'..'Z' + 'a'..'z' 的 Unicode 属性,并且在处理 Unicode 时得到扩展,所以如果你有多字节字符,你可能应该使用它.

      【讨论】:

        【解决方案6】:

        使用 Regexp#union 创建一个大的匹配对象

        allowed = Regexp.union(/[a-zA-Z0-9]/, " ", "-", ":", ")", "(", ".")
        cleanstring = dirty_string.chars.select {|c| c =~ allowed}.join("")
        

        【讨论】:

          【解决方案7】:

          如果你有一个字符串,我看不出o.replace 是做什么用的:

          string = 't = 4 6 ^'
          

          你做到了:

          string.gsub!(/\W+/, '')
          

          你得到:

          t46
          

          如果你也想去掉数字字符,你可以这样做:

          string.gsub!(/\W+|\d+/, '')
          

          你会得到:

          t
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-27
            • 1970-01-01
            • 2012-01-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多