什么是awk中的“非法主要”?

时间:2018-05-01 20:10:18

标签: regex awk

Awk给了我以下错误:

awk: illegal primary in regular expression (?<=\>)(.*?)(?=\<) at <=\>)(.*?)(?=\<)
source line number 10 source file transpile.awk
context is
    match($0, >>>  /(?<=\>)(.*?)(?=\<)/) <<< 

是“非法主要”?

2 个答案:

答案 0 :(得分:1)

如果您查看awk source code,则可以看到非法主要是一个默认的FATAL错误,当时没有任何案例正则表达式令牌匹配。它不是语法错误

以下是来自awk(剥离)的b.c文件的具体代码,

    case NCCL:
        np = op2(NCCL, NIL, (Node *) cclenter((char *) rlxstr));
        rtok = relex();
        return (unary(np));
    case '^':
        rtok = relex();
        return (unary(op2(CHAR, NIL, itonp(HAT))));
    case '$':
        rtok = relex();
        return (unary(op2(CHAR, NIL, NIL)));
    case '(':
        rtok = relex();
        if (rtok == ')') {  /* special pleading for () */
            rtok = relex();
            return unary(op2(CCL, NIL, (Node *) tostring("")));
        }
        np = regexp();
        if (rtok == ')') {
            rtok = relex();
            return (unary(np));
        }
        else
            FATAL("syntax error in regular expression %s at %s", lastre, prestr);
    default:
        FATAL("illegal primary in regular expression %s at %s", lastre, prestr);

这段代码也可以在github上找到,

https://github.com/onetrueawk/awk/blob/master/b.c

在您的具体情况下,原因是因为awk不支持Lookarounds,即Lookahead:(?=...), (?!...)和Lookbehind:(?<=...), (?<!...)

希望这有帮助

答案 1 :(得分:1)

用awk的说法,“主要”是正则表达式的基本单位。

正则表达式由(1个或多个)分支的替代组成。每个分支由(0或更多)原色的串联组成。

主要是普通字符(例如a),或转义的特殊字符(例如\*),或字符类([...])或点({ {1}})或锚点(.^)或带括号的子表达式($)。其中大多数也可以有量词((...)?+)。

你的正则表达式的问题是*首先解析为(?<=\>),它启动一个子组。接下来的项目需要是主要的。 (不是有效的主要内容,因此您会收到错误。

Awk不支持前瞻或后视。