【问题标题】:Rewrite Perl regular expression [closed]重写 Perl 正则表达式 [关闭]
【发布时间】:2011-12-13 01:58:42
【问题描述】:

我正在尝试在不使用 or 运算符的情况下重写此代码。

    if((/^\s*field\s+{\s*$/)||(/^\s*field\s+{\s*\/\/.*$/)
    {
        # Do something
    }  

【问题讨论】:

  • 为什么要任意限制? (这是作业吗?)
  • 您在这里没有提供足够的信息。你想匹配什么标准? /./ 的正则表达式将匹配所有没有“|”的行运算符。
  • 不是作业 :) 我正在编写解析器,我想匹配注释行。 -2 这个?!
  • @alertjean - -3 分,3 票结束....并计数。如果您愿意用简单的英语解释您实际尝试做的事情,您也许可以回答您的问题。不过,我会快点,因为您可能只剩下几分钟就可以结束这个问题了。
  • @alertjean:不要给出示例,因为有几十种方法可以解释它们。给出规则!

标签: regex perl matching regex-group


【解决方案1】:

您的规则没有很好地指定,但您可以通过简单的方式捕获这些行:

^text[1-3]

这将得到所有以textN 单词开头的行,其中N 是集合{1,2,3} 之一。这似乎是最有可能的,因为它也可以通过正则表达式 | 功能实现:

^(text1|text2|text3)

但是,如上所述,规格不是那么详细,所以我们并不真正知道您想要捕捉什么。您应该指定需要捕获的确切规则,而不仅仅是可能被误解的示例。


好的,在你的一个 cmets 之后,它开始有意义了:

我正在解析一个类似 C++ 的文件,我希望我的解析器同时匹配已注释和未注释的行(单行 cmets)。

因此,您正在寻找具有有效行尾 cmets // 的行或根本没有 cmets 的行。

您评论中的关键词是“解析”。说真的,除非您知道代码会非常非常简单,否则不要尝试使用正则表达式来执行此操作。如果要解析,则需要一个解析器。干净利落。事实上,即使是简单的代码,我也建议你使用解析器。

示例:您将如何处理以下完全有效的行:

int ratio = height
                  /
                   width;
char *description = "This program will look for '//' markers";
int myvar = text1 / comment;

假设您的类 C++ 语言会非常简单(例如,除了行尾的 cmets 之外没有 // 字符),您可能只需要去掉 //.$在早期传球中离开每条线的末端,以便在以后的传球中看不到 cmet。

但是,这对您的语法/语法有相当严格的限制,除非您可以强加,否则词法分析器/解析器是最好的方法。

【讨论】:

  • 说文件有 C++ 风格的行 cmets 会更合适。除了 cmets 之外,不会有任何杂散/字符。
  • @alertjean,您可能仍然需要一个解析器,以便处理示例中的char *description 之类的事情。我将使用正则表达式处理您的需求的简化方式来更新答案。
【解决方案2】:

如果你想重写

(/^\s*field\s+{\s*$/) || (/^\s*field\s+{\s*\/\/.*$/)

我可以建议:

m#^\s*field\s+{\s*($|//)#

最后一部分($|//) 将寻找两个有效的行尾中的任何一个:只是行尾,或两个斜杠。请注意,斜线后面可以跟任何字符,就好像您写了//.*$

【讨论】:

  • 此文件中不会有除法运算符。
  • 嗯.. 这段代码会做某事,但我怀疑你是否可以做任何事情,除非你使用更具体的工具,就像 paxdiablo 在他的最新版本中建议的那样.
  • 刚刚对原始问题进行了一次编辑。我想我是在描述一个 XY 问题。
  • @alertjean 是的,这很容易解决。更新了我的答案。
  • @alertjean 如果您了解 XY 问题,请查看 The Wrong Question =)
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多