【问题标题】:Regex Match without new line ^M没有换行符的正则表达式匹配 ^M
【发布时间】:2015-06-11 08:46:17
【问题描述】:

我的 perl 脚本中有一个正则表达式 /Operating System:\s*(.*)/。 我匹配的行是Operating System: Windows XP Service Pack 3 但是,在该行之后输入后有一个新行。所以文本将被视为Operating System: Windows XP Service Pack 3^M

有没有办法摆脱^M 使用我拥有的当前正则表达式?它捕获Windows XP Service Pack 3^M,但^M 仅在我使用命令提示符或PuTTy 的more 显示内容时才显示。当我使用vi 或更确切地说是vim 进行编辑时,它会显示。

有什么帮助吗?

【问题讨论】:

  • 哦,对不起,我发布了错误的正则表达式。我关注了您删除的评论,它适用于(?=\r)。您可以使用此正则表达式 /Operating System:\s*(.*)/ 将其发布。我会将其标记为已接受。 :)
  • 我不明白为什么你的正则表达式应该匹配尾随换行符 - 你确定腻子不会做某种“writeln”并在匹配后添加换行符吗? (检查:regex101.com/r/mH4fP7/1
  • @pastacool 不,那是因为我正在从日志文件中读取,它使用^M 换行。

标签: regex perl newline vi


【解决方案1】:

与 CR 相比,我认为使用我在解决您的主要问题时提出的模式更直观

/Operating System:\s*(.*\S)/

它捕获从Operating System 之后的第一个到最后一个非空格字符的所有内容。除了更具可读性之外,这种模式的主要优点是可移植,并且不依赖于行尾是否存在尾随 CR(无论如何,它可能不会出现在文件的最后一行)。

CR 和 LF 都算作空格,因此它会忽略它们以及文件中可能存在的任何尾随空格或制表符

【讨论】:

  • 我喜欢这个而不是/Operating System:\s*([^\r\n]+)/,因为它也会忽略任何尾随空格。不过,如果答案是独立的,而不是建立在 vks 的基础上,那就太好了。
  • @ikegami:你为什么认为它不是独立的?我同意对另一个解决方案发表评论是多余的,可能有点麻烦,但我不认为我自己的帖子依赖于其他人的信息
  • @ikegami:我以前机械地写这个\S+(?:\s+\S+)*直到我看到了光
  • 只是缺少^M代表CR的解释。 \S+(?:\s+\S+)* 处理匹配失败的能力远胜于 \s*(.*\S),但在这种情况下,这并不重要。
  • 我明白了,我尝试这样做,但可能有语法错误。 +1
【解决方案2】:
Operating System:\s*(.*)(?=\r)

你可以试试这个。

搜索时

...

\n 是换行符,\r 是 CR(回车 = Ctrl-M = ^M)

【讨论】:

  • @hzq . 不会匹配没有sDOTALL 标志的\n。所以它必须匹配\r
  • 这是一个黑客。 Perl 设计为在每个输入行的末尾只有一个 LF,并且 CR 仅在读取错误解码的跨平台数据时出现。存在工件的编码是错误的形式,文件最后一行的末尾可能没有 CR。
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多