Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:如何根据给定的正则表达式追加到字符串的每一行?_Ruby_Regex - Fatal编程技术网

Ruby:如何根据给定的正则表达式追加到字符串的每一行?

Ruby:如何根据给定的正则表达式追加到字符串的每一行?,ruby,regex,Ruby,Regex,我想将附加到缺少的每一行: text = '<tag>line 1</tag> <tag>line2 # no closing tag, append <tag>line3 # no closing tag, append line4</tag> # no opening tag, but has a closing tag, so ignor

我想将
附加到缺少的每一行:

text = '<tag>line 1</tag>
        <tag>line2         # no closing tag, append
        <tag>line3         # no closing tag, append
             line4</tag>   # no opening tag, but has a closing tag, so ignore
        <tag>line5</tag>'
text=”第1行
第2行#无结束标记,追加
第3行#无结束标记,追加
第4行#没有开始标记,但有结束标记,因此忽略
第5行'
我试图创建一个正则表达式来匹配此表达式,但我知道它是错误的:

text.gsub! /.*?(<\/tag>)Z/, '</tag>'
text.gsub!/.*?(“Z/,”

如何创建一个正则表达式来有条件地追加每一行?

根据提供的示例,我只需执行以下操作:

text.split(/<\/?tag>/).
     reject {|t| t.strip.length == 0 }.
     map {|t| "<tag>%s</tag>" % t.strip }.
     join("\n")
text.split(//)。
拒绝{| t | t.strip.length==0}。
映射{t|%s”%t.strip}。
加入(“\n”)
基本上,您将和视为记录分隔符,因此您可以对它们进行拆分,拒绝任何空白记录,然后从提取的值构造一个新的组合字符串。当您不能指望换行符是记录分隔符时,这种方法可以很好地工作,并且通常可以容忍丢失的标记

但是,如果您坚持使用纯正则表达式解决方案,并且您的数据格式将始终与给定格式匹配(每行一条记录),则可以使用反向查找:

text.strip.gsub(/(?<!<\/tag>)(\n|$)/, "</tag>\\1")
text.strip.gsub(/(?)(\n |$)/,“\\1”)
给你:

text.gsub!(%r{(?<!</tag>)$}, "</tag>")
text.gsub!(%r{(?)},”)
说明:

$
表示行结束,
\z
表示字符串结束
\Z
的意思类似,但有一些复杂之处


(?共同创建一个负面的后顾。

一个可行的方法是:

/<tag>[^\n ]+[^>][\s]*(\n)/
/[^\n]+[^>][\s]*(\n)/
这将返回所有不带“>”的换行符

将其替换为“\n”,即

text.gsub!(/[^\n]+[^>][\s]*(\n)/,“\n”)
如需进一步润色,请尝试第1行 第2行 第3行 第4行 第5行' result=“” text.u每行do |行| line.rstrip!
行你绝对确定每行只包含一个标记吗?会有嵌套的标记吗?看看Ruby中对负查找的支持似乎有点古怪,拆分这些行并查找
子字符串并在找不到它时追加一个可能会更容易。在我的示例中,应该总是有
在一行的末尾。@NullUserException-ruby lookbehind有什么好玩的?我想你是在想象1.9之前的场景。谢谢!我删除了我的评论,并将解释移到了答案中,这样其他人更容易看到。
text.gsub!( /<tag>[^\n ]+[^>][\s]*(\n)/ , "</tag>\n")
text = '<tag>line 1</tag>
        <tag>line2        
        <tag>line3
        line4</tag>
        <tag>line5</tag>'

result = ""

text.each_line do |line|
  line.rstrip!
  line << "</tag>" if not line.end_with?("</tag>")
  result << line << "\n"
end

puts result

--output:--
<tag>line 1</tag>
        <tag>line2</tag>
        <tag>line3</tag>
        line4</tag>
        <tag>line5</tag>