【问题标题】:Find and replace special character and special character with character用字符查找和替换特殊字符和特殊字符
【发布时间】:2015-07-10 02:46:59
【问题描述】:

我想修改给定的字符串:

a = "John;Rich;jrich@gmail.com\r\n" 
b = "John;Rich;jrich@gmail.com\r" 
c = "John,Rich,jrich@gmail.com\n"

一种格式:

"xxx,yyy,zzzz\n"

我认为最好的方法是使用正则表达式来查找和替换,但我没有这方面的经验。 我写了简单的代码来改变; => ,

a.gsub(/[;]/,',')

我发现正则表达式 /(\\r\\n)/ 会为我找到 \r\n/(\\r)/ - \r
我在将所有正则表达式连接在一起以使用一个 gsub 执行整个字符串修改时遇到问题。

【问题讨论】:

  • 你确定/(\\r\\n)/ 是正确的吗?我在codepad.org/ZSO5PJDb 的测试似乎表明它应该是/(\r\n)/
  • 您实际上有三个字符串abc,还是那个包含不同行终止符的大字符串?

标签: ruby regex


【解决方案1】:

怎么样:

a.gsub(/\R/,'\n')

\R 代表任何换行符

【讨论】:

  • 我在 irb 中尝试过,结果如下:1.9.3-p551 :001 > a = "John;Rich;jrich@gmail.com\r\n" => "John;Rich;jrich@gmail.com\r\n" 1.9.3-p551 :002 > a.gsub(/\R/,'\n') => "John;\\nich;jrich@gmail.com\r\n"
  • @Gregy:我不是 Ruby 方面的专家,可能你必须双重转义:\\R
  • Ruby 不是 PHP,"\R" 匹配文字 'R'。
  • @Taemyr:\R 不是来自 php,它是 PCRE 功能,请参阅:pcre.org/pcre2.txt
  • 对不起。 PHP 是我发现的唯一匹配“\R”的在线测试器。纯 PCRE 测试器没有,不知道为什么。(可能是因为它没有将完整的输入视为单个字符串)。重要的一点是“\R”不在 Ruby 中。
【解决方案2】:

管道字符| 应该可以解决您的问题。 foo|bar 匹配 foo 或 bar,因此您可以将您的正则表达式加入为 /(\\r\\n|\\r)/

但是,在您的情况下,更好的解决方案是 ?(foo)? 匹配 foo 的零次或一次出现。所以你可以把你的正则表达式写成/(\\r(\\n)?)/

要在单个 gsub 中完成所有操作,您需要一次性替换整个字符串。你可以这样做;

puts a.gsub(/([^;]*);([^;]*);(.*?)(\r\n|\r|\n)/,"\\1,\\2,\\3\n")

【讨论】:

  • @Toto 应该吗?据我了解,您无需将 \n 更改为任何内容。
  • @Toto 实际上,我遇到了一个问题,因为它不匹配。因此,当我添加替换整个字符串方法时,我必须扩展正则表达式。
【解决方案3】:

试试这个:

result = subject.gsub(/[\r\n]+/, '\n')

正则表达式剖析:

"
[\\r\\n]    # Match a single character present in the list below
             # A carriage return character
             # A line feed character
   +         # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
"

希望这会有所帮助...

【讨论】:

  • 它似乎工作得很完美!你能再告诉我一件事吗?如何使用我的a.gsub(/[;]/,',') 加入它?
  • 我知道有可能做这样的事情a.gsub(/[\r\n]+/, "\n").gsub(/[;]/,',') 但我想知道是否有 DRY 方法可以做到这一点
  • 我对 Ruby 不是很精通,但如果可能的话,可以假设一下 subject.gsub(/[\r\n]+/, '\n').gsub(/;/,',')...
  • 这将杀死空行。不过,如果每一行都到达它自己的变量中,这不是问题,所以对于 OP 来说可能不是问题。
  • @Taemyr:感谢您通知那个人,因为我已经提到我对 Ruby 一点也不精通...
【解决方案4】:

我在将所有正则表达式连接在一起以使用一个 gsub 执行整个字符串修改时遇到问题。

您可以将哈希传递给gsub

replacements = {
  ';'    => ',',
  "\r\n" => "\n",
  "\r"   => "\n"
}

a.gsub(Regexp.union(replacements.keys), replacements)
#=> "John,Rich,jrich@gmail.com\n"

b.gsub(Regexp.union(replacements.keys), replacements)
#=> "John,Rich,jrich@gmail.com\n"

c.gsub(Regexp.union(replacements.keys), replacements)
#=> "John,Rich,jrich@gmail.com\n"

您还可以使用chomp 删除行终止符并使用tr 进行替换:

a.chomp.tr(';', ',') << "\n"
#=> "John,Rich,jrich@gmail.com\n"

b.chomp.tr(';', ',') << "\n"
#=> "John,Rich,jrich@gmail.com\n"

c.chomp.tr(';', ',') << "\n"
#=> "John,Rich,jrich@gmail.com\n"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2011-12-28
    相关资源
    最近更新 更多