【问题标题】:Regex a string with variable whitespace and a newline正则表达式具有可变空格和换行符的字符串
【发布时间】:2013-11-01 14:10:47
【问题描述】:

我正在尝试搜索以下字符串:

<td></td>
<td>)</td>

除了换行符之外,&lt;/td&gt;&lt;td&gt; 之间可以有任意数量的空格。总是只有一个换行符,但是一个简单地忽略所有空格(包括换行符)的表达式就可以了。

我试图弄清楚如何使用此信息执行字符串替换而不折叠文件中的所有空白。我发现许多解决方案都带有处理空格的表达式,但我也无法使用换行符。

我的正则表达式经验有限。我应该如何从 bash shell 环境中解决这个问题?

【问题讨论】:

  • 使用 dom [ 和 xpath ] 操作 html 文档
  • 您还没有确切地说出您要替换的内容。如果您阅读了诸如sedawk 中的正则表达式,您会发现用于识别换行符的选项。
  • 请显示示例输出(替换后)
  • 你想在 outfile 中替换什么?标签或这两行中的东西?

标签: regex bash sed


【解决方案1】:

如果我对您的理解正确,您正在尝试匹配一个空的 &lt;td&gt; 标记对,后跟一个换行符和一个 &lt;td&gt; 标记对,其中包含一个右括号(第一个 @ 后有任意数量的空格987654324@ 和/或在第二个 &lt;td&gt; 之前)。如果正确,请尝试以下表达式:

<td></td> *\n *<td>)</td>

注意sed 通常不支持多行匹配,因此您需要使用标签并将下一行附加到当前行,然后再进行替换(完整说明请参见here):

sed ':a;N;$!ba;s|<td></td> *\n *<td>)</td>|...|g' infile >outfile

将省略号 (...) 替换为您的实际替换文本。

【讨论】:

  • 这非常有效。我不得不编辑一个错字(!$ 应该是 $!);仍在等待同行评审。
【解决方案2】:
<td>\s*?\)?\s*?</td>

这将匹配带有可选的 ) 和标签之间任意数量的空格。 不过我不确定,这是否是您真正要查找的字符串?

但是,它的要点是使用 \s 作为空格的字符类,包括换行符。

【讨论】:

  • 无需使用不情愿的量词 IMO。
  • 可能,但据我所知,在这个表达式中包含它们也没有什么坏处。
  • 这取决于您匹配的内容,但它们可能会更慢。如果不推荐甚至不可能进行较短的匹配,那么最好坚持使用贪婪的量词。在这种情况下\\s*?\) 最短和最长的匹配总是相同的,不情愿的量词只会导致大量的回溯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多