-3

我正在尝试在没有 or 运算符的情况下重写此代码。

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

2 回答 2

2

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

^text[1-3]

textN这将使所有行都以where Nis one of set 的那些单词开头{1,2,3}。这似乎最有可能基于它也可以通过正则表达式|功能实现的事实:

^(text1|text2|text3)

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


好的,在您的评论之一之后,它开始有意义:

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

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

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

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

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

假设您的类 C++ 语言非常简单(例如,除了行尾的注释之外没有//其他字符),您可能只需//.$在早期通过时去掉每行的末尾,这样就看不到注释了在以后的传球中。

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

于 2011-12-13T02:01:21.273 回答
0

如果你想重写

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

我可以建议:

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

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

于 2011-12-13T02:44:18.083 回答