查找并替换特殊字符和特殊字符

时间:2015-04-30 11:52:43

标签: ruby regex

我想修改给定的字符串:

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执行整个字符串修改时遇到问题。

4 个答案:

答案 0 :(得分:4)

试试这个:

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

RegEx解剖:

"
[\\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)
"

希望这会有所帮助......

答案 1 :(得分:3)

  

我将所有正则表达式加在一起以使用一个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"

答案 2 :(得分:0)

怎么样:

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

\R代表任何换行符

答案 3 :(得分:0)

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

但是在你的情况下,更好的解决方案是?(foo)?匹配零或一次foo。因此,您可以将正则表达式编写为/(\\r(\\n)?)/

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

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