【问题标题】:How to replace & with \& with gsub on rails? [duplicate]如何在导轨上用 gsub 替换 & 和 \&? [复制]
【发布时间】:2019-09-06 14:24:38
【问题描述】:

我正在编写一个填充乳胶公式的 ruby​​-on-rails 应用程序。现在,当用户提交的变量包含字符 &(例如,Company & Co. KG)时,我遇到了 pdflatex 错误。对于 Latex,它是一个新的表格列,我需要使用 \& 转义这些字符。

我在Ubuntu 18.04.3 LTS 上使用Rails 5.2.3ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

我尝试使用gsub 替换字符串中的所有&,但遇到了两个问题。

  1. \& 被匹配的字符串替换
  2. 我只能插入双反斜杠\\

所以我也尝试用\ 替换& 之前的字符,但没有成功。

a = "T & T"
a.gsub(&, "\&")               -> "T & T"
a.gsub(/(.{1})(?=&)/, " \")   -> error:  unterminated string meets end of file
a.gsub(/(.{1})(?=&)/, " \\")  -> "T \\& T" 

如何用单个\ 替换字符,或者我可以以某种方式转义反转的\&

【问题讨论】:

  • 您很可能以向您显示转义版本的方式检查您的字符串。在 irb 中试试这个:92.chr(产生一个带有单斜杠的字符串)将输出"\\";但puts 92.chr 将产生\ ,即字符串的真实内容。你的代码都没有给你双反斜杠。
  • 您要同时替换“&”和“”吗?还是只是“&”加空格?
  • 如果你的& 已经被转义了怎么办?如果您使用.gsub('&', '\\\&'),您将在& 之前有两个反斜杠。使用.gsub(/\\?&/, '\\\&')

标签: regex ruby string


【解决方案1】:

在替换字符串中使用三重\

print 'Company & Co. KG'.gsub('&', '\\\&')
# Company \& Co. KG=> nil

您可以通过检查两个字符串的长度来检查是否添加了单个反斜杠:

'Company & Co. KG'.size
# => 16
'Company & Co. KG'.gsub('&', '\\\&').size
# => 17

为了更好地理解它,请阅读转义:

编辑:

\&backreference to the whole match(如\0

'Company & Co. KG'.gsub(/Co/, '-\&-')
# => "-Co-mpany & -Co-. KG"
'Company & Co. KG'.gsub(/Co/, '-\0-')
# => "-Co-mpany & -Co-. KG"

【讨论】:

  • 谢谢,但它不起作用。当我运行它时,我得到>> 'Company & Co. KG'.gsub('&', '\\\&') => "Company \\& Co. KG"
  • 阅读我在问题下的评论。结果中有 not 两个反斜杠,尽管出现了。这个答案是正确的。
  • 有没有办法逃避\& ?我遇到了进一步的问题,因为我的 tex 文件的实际填充是由 gsub 再次完成的,它读取 \&\0 如你所说。编辑:您链接中的解决方案对我不起作用
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多