0

这个问题与此有关:Using regex to pass syntax-valid c++ declaration/initialization感谢Jerry的回答。

但现在程序流程已经重新设计。它现在将检查每种数据类型的声明语法。

//found int
if( /+sint$/.test(kword_search)){

    //syntax check
    if( //*modified regex for int declaration checking*//.test(kword_syntax_search) ){
        //no error in int;
    }
}

//found char
if( /+schar$/.test(kword_search)){

    //syntax check
    if( //*modified regex for char declaration checking*//.test(kword_syntax_search) ){
        //no error in char;
    }
}

//found float
if( /+sfloat$/.test(kword_search)){

    //syntax check
    if( //*modified regex for float declaration checking*//.test(kword_syntax_search) ){
        //no error in float;
    }
}

//found bool
if( /+sbool$/.test(kword_search)){

    //syntax check
    if( //*modified regex for bool declaration checking*//.test(kword_syntax_search) ){
        //no error in bool;
    }
}

所以,基本上以前的答案是这样使用的:

//found int|char|bool|float
if( /+s(?:int|float|char|bool)$/.test(kword_search)){

    //syntax check
    if( /^(?:\s*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*(?:[A-Za-z0-9]+(?:[+\/*-][A-Za-z0-9]+)?|[‌​0-9]+(?:\.[0-9]+)?(?:[+\/*-][0-9]+(?:\.[0-9]+)?)?|"[^"]*"|'[^']*'))?\s*,)*\s*[A-Z‌​a-z_][A-Za-z0-9]*\s*(?:=\s*(?:[A-Za-z0-9]+(?:[+\/*-][A-Za-z0-9]+)?|[0-9]+(?:\.[0-‌​9]+)?(?:[+\/*-][0-9]+(?:\.[0-9]+)?)?|"[^"]*"|'[^']*'))?\s*;/.test(kword_syntax_search) ){
        //no error in declaration/initialization by mixing them;
    }
}

我需要一些帮助来将此正则表达式切碎为 4 组正则表达式,专门用于评估第一块代码中的 int、char、float 和 bool(Jerry的回答):

^(?:\s*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*(?:[A-Za-z0-9]+(?:[+\/*-][A-Za-z0-9]+)?|[‌​0-9]+(?:\.[0-9]+)?(?:[+\/*-][0-9]+(?:\.[0-9]+)?)?|"[^"]*"|'[^']*'))?\s*,)*\s*[A-Z‌​a-z_][A-Za-z0-9]*\s*(?:=\s*(?:[A-Za-z0-9]+(?:[+\/*-][A-Za-z0-9]+)?|[0-9]+(?:\.[0-‌​9]+)?(?:[+\/*-][0-9]+(?:\.[0-9]+)?)?|"[^"]*"|'[^']*'))?\s*;http://regex101.com/r/aD2hA6

我的目标是在我的代码编辑器中告诉这个字符串输入是否在语法上有效

整数a,b,_ab;//valid

整数a=0,b=333; //valid

整数a, b=; //not valid

整数a,,b,,; //not valid

整数1var; //not valid

整数a='sts', b=false, c=23.0 // not valid

漂浮a,b;//valid

漂浮a=2, a=3.33//valid

漂浮a='sfsdf';//not valid

漂浮a==3;//not valid

漂浮a,, b=3.0//not valid

字符a, b;//valid

字符a='a', b='!', c='3';//valid

字符a='ab';//not valid

字符a,b=3;//not valid

字符a,b="a";//not valid

布尔a=true, b=false;

布尔a="true"; //not valid

(明白了吗?)

再次......我知道正则表达式不是这样做的正确方法。谢谢

4

1 回答 1

1

对于整数一,您也许可以使用:

^(?:[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+)?,\s*)*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+)?;$

这些将匹配a,b;a=0,b=333;并拒绝a, b=;a='sts'b=false, c=23.0

对于浮动,也许是那个:

^(?:[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+(?:\.[0-9]+)?)?,\s*)*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+(?:\.[0-9]+)?)?;$

对于字符语法,我猜:

^(?:[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*'[^']')?,\s*)*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*'[^']')?;$

对于布尔值,也许是:

^(?:[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*(?:true|false))?,\s*)*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*(?:true|false))?;$

注意:这些是专门为您提供的示例而制作的。我不能保证它适用于您所拥有的所有不同场景,因为我对 C++ 没有太多经验。

编辑:将运算符添加到浮点和整数正则表达式:

整数

^(?:[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+(?:[+\/*-][0-9]+)?)?,\s*)*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+(?:[+\/*-][0-9]+)?)?;$

漂浮

^(?:[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+(?:\.[0-9]+)?(?:\s*[+\/*-[0-9]+(?:\.[0-9]+)?)?)?,\s*)*[A-Za-z_][A-Za-z0-9]*\s*(?:=\s*[0-9]+(?:\.[0-9]+)?(?:\s*[+\/*-[0-9]+(?:\.[0-9]+)?)?)?;$
于 2013-08-25T19:39:04.593 回答