【问题标题】:perl regular expression to get the text between 5) some text 6)perl 正则表达式来获取 5) 一些文本 6) 之间的文本
【发布时间】:2013-05-09 15:44:45
【问题描述】:

5) 在 64 位操作系统上,在 32 位操作系统上转到 C:\Program Files (x86)\Common gateway 6)

在上面的示例中,我试图获取 5) 和 6) 之间的文本,即 On 64bit OS go to C:\Program Files (x86)\Common gateway

我在5[)]\s?(.*?)6[)]\s?/i 后面写了,但这里失败了,因为我有(x86),所以我的表达式将匹配On 64bit OS go to C:\Program Files (x8

所以我正在考虑添加[^\/],所以它会跳过x86)\,但它不起作用......请有人帮忙。

【问题讨论】:

  • 您的一般问题是什么?可以轻松解决您的样本的正则表达式是 ^5\)(\s.*\s)6\)。不过,它在大多数情况下都会在类似的数据上失败。

标签: regex perl pattern-matching


【解决方案1】:

如果我正确阅读了这个问题,您希望匹配到 6),除非 6) 是字符串 (x86) 的一部分。在这种情况下,使用否定的后视断言:

/5\)\s?(.*?)(?<!\(x8)6\)\s?/i

也就是说,...匹配到6),除非它是(x86)

【讨论】:

  • 嗨,暴民只是另一个问题.. 5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x86) 在这个例子中,如果我想 grep on 32 bit (x86) 这是在 6) 之后我使用什么 .. 我尝试了 m/6[)]\s?(.*)/i 但它grepped @987654330 @ ...
【解决方案2】:

怎么样:

5\)(.*?)\s6\)

我正在使用6) 之前的空格来获取您想要的内容,而您捕获的字符串中不需要这个空格,对吧?

【讨论】:

  • 所以空格是可选的......我的模式中的一个......它可能会或可能不会出现在字符串中。
  • @Tanuj 您能否提供更多可能遇到的字符串示例?
  • 5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x86) 这个字符串是示例之一..这里的空格是可选的..它可能会或可能不会出现在字符串中...
  • 那么,如果我理解得很好,你想在这里得到On 64bit OS go to C:\Program Files (x86)\Common gateway 吗?还是On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x?请注意,我的正则表达式适用于我问你的第一个选项。
  • 我想在这里得到On 64bit OS go to C:\Program Files (x86)\Common gateway
【解决方案3】:

这是另一个选择:

use strict;
use warnings;

while (<DATA>) {
    my ($text) = /(?:\b\d+\))(.+?)(?:\s\d+\))/;
    print "$text\n";
}

__DATA__
5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit
42)even more text 43)I think
7)Twenty four (24) 8)

输出:

 On 64bit OS go to C:\Program Files (x86)\Common gateway
even more text
Twenty four (24)

正则表达式尝试首先匹配单词边界,后跟一个+数字,然后是右括号。然后它非贪婪地捕获所有内容,直到一个空格,后跟一个+数字,然后是一个右括号。

希望这会有所帮助!

【讨论】:

    【解决方案4】:

    删除“不贪婪”的限定词。

    也就是说,替换捕获模式

    (.*?)
    

    (.*)
    

    第一个将尽可能少地匹配。 第二个会尽可能匹配。

    【讨论】:

    • 如果我有类似5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x86) 的东西,这将失败此模式将匹配5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x8
    • 替换你的收官战“6[)]\s?”使用“6[)]”。也就是说,匹配这里的空格。顺便说一句,尾随的“\s?”什么都不做,因为它既是可选的又是非捕获的。
    • 谢谢 ..@fisharebest 我已经从最后一个中删除了 ..但是我在...之间进行测试的问题是有没有办法让我有类似 match 6) 的东西,这不是我的/
    【解决方案5】:

    简单的5\)(.*6\).*)6\) 应该把它全部放在$1 中。我不会在正则表达式中排除任何周围的空白,而是使用trim($1)

    尝试匹配正则表达式中的空格(例如5\)\s*(.*6\).*)\s*6\))的一个问题是知道表达式的哪一部分与最右边的6) 之前的空格匹配。考虑到.*\s*6\) 部分,.*\s* 是否与text 6) 中的空格匹配?因此建议使用修剪。

    【讨论】:

    • 只要右边有另一个6),就会失败。空格在这里很重要。
    • 问题中只有一个)6。但是使用非贪婪的.*? 就足够了。
    • @AdrianHHH 请仔细阅读这个问题。有两个6),一个在(x86),另一个在后面。
    • 如果我有类似5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x86) 这样的模式将匹配5) On 64bit OS go to C:\Program Files (x86)\Common gateway 6) on 32 bit (x8
    • 如果我去 .*?比我在问题中提到的更贪婪。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多