【问题标题】:Why doesn't my regex match the end of the string?为什么我的正则表达式不匹配字符串的结尾?
【发布时间】:2013-09-18 17:29:47
【问题描述】:

我正在尝试将<p> 标记添加到用户生成的文本中以代替换行符。

这是我的代码:

string.gsub(/(.*)[\n\r\Z$]+/, "<p>\\1</p>")

替换的效果与第一段的预期完全相同,但如果我添加额外的回车,它只会包装最后的文本块。 \Z$ 似乎不像我预期的那样匹配。

我做错了什么?

这个:

Lorem ipsum dolor sit amet. 
\n
Vestibulum laoreet erat id quam.

变成这样:

<p>Lorem ipsum dolor sit amet.</p> 

Vestibulum laoreet erat id quam.

但是这个:

Lorem ipsum dolor sit amet. 
\n
Vestibulum laoreet erat id quam.
\n

变成这样:

<p>Lorem ipsum dolor sit amet.</p> 

<p>Vestibulum laoreet erat id quam.</p>

【问题讨论】:

  • 这是一个 Rails 函数。我将编辑问题。
  • 另外,第二行(空)会发生什么?不清楚。
  • 还是不清楚。您想用p 标记包围每一行,除非该行仅包含白色字符?

标签: ruby regex gsub


【解决方案1】:

尝试使用正则表达式

/\A((?:.|[\n\r])+)\Z/

并替换为\\1

您当前的正则表达式与输入字符串中的最后一个换行符/回车符匹配,\Z 甚至无法正常工作。 $ 是字符类中的文字字符。


如果你的意思是你想在&lt;p&gt;&lt;/p&gt; 之间换行,那么你可以简单地使用:

/^(.+)$/

并替换为\\1

或者使用正则表达式:

/([^\n\r]+)/

【讨论】:

  • 这会将所有文本包装在一个 &lt;p&gt; 中。每个文本块不能有多个 ps。
  • @Emerson 我认为.^$ 在Ruby/Rails 上的行为可能不同...尝试最后一个正则表达式并告诉我,因为它不使用任何@987654334 @ 或 ^$.
【解决方案2】:

我会这样做:

ary = [
  "Lorem ipsum dolor sit amet.\nVestibulum laoreet erat id quam.",
  "Lorem ipsum dolor sit amet.\nVestibulum laoreet erat id quam.\n"
]

puts ary.map{ |a| 
  a.scan(/.+$/).map{ |s| "<p>#{s}</p>" } 
}
# >> <p>Lorem ipsum dolor sit amet.</p>
# >> <p>Vestibulum laoreet erat id quam.</p>
# >> <p>Lorem ipsum dolor sit amet.</p>
# >> <p>Vestibulum laoreet erat id quam.</p>

两个字符串的返回方式相同。

正则表达式不是一根魔杖,你可以挥动来解决所有问题。它们有其用途,但太多人认为它们是解决大多数问题的正确工具,但事实并非如此。此外,人们认为模式越复杂,就越有可能解决问题,但复杂性反而为垃圾提供了更多的空间,因此请保持简单。

这段代码:

a.scan(/.+$/).map{ |s| "<p>#{s}</p>" }

依靠字符串的scan 来查看字符串并返回所有以“\n”结尾的行。如果该行不以“\n”结尾,它也会被返回,因为它是字符串的最后一部分。 scan 返回一个匹配数组,因此,在这种特殊情况下,这将是一个由 EOL 终止的字符串片段数组,并带有可能的尾随字符串片段。

通过map 将字符串片段嵌入&lt;p&gt;...&lt;/p&gt; 中,然后就完成了。

完成同样事情的另一种方法是利用 String 的 gsub 和一个块:

puts ary.map{ |a| 
  a.gsub(/.+$/) { |s| "<p>#{s}</p>" }
}
# >> <p>Lorem ipsum dolor sit amet.</p>
# >> <p>Vestibulum laoreet erat id quam.</p>
# >> <p>Lorem ipsum dolor sit amet.</p>
# >> <p>Vestibulum laoreet erat id quam.</p>

对于每个匹配模式的实例,gsub 会将匹配的文本传递给块。从那里它是另一个简单的字符串插值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多