正则表达式 - 与运营商分开操作数

时间:2018-01-12 21:21:09

标签: regex

我想通过正则表达式验证我的中缀表示法。现在我有这样的事情:

^[a-zA-Z0-9_]+(( [a-zA-Z0-9_]+)|( [\+\-\/\*]))*( [a-zA-Z0-9_]+)$

我检查expresion是否以操作数开始和结束。在中间,我可以让操作数或运算符始终由单个空格分隔。可能只有一个运算符,操作数可以有多个字符。现在一切似乎都还可以。但我还想检查操作数是否总是由运算符分隔,我不知道如何实现。有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用以下修复:

^[a-zA-Z0-9_]+(?: *[+\/*-] *[a-zA-Z0-9_]+)*$

请参阅regex demo

请注意,根据正则表达式库,您可能使用\w而不是[a-zA-Z0-9_],而不是使用\w,因为在.NET或Python中,^默认情况下是Unicode。< / p>

模式详情

  • [a-zA-Z0-9_]+ - 字符串开头
  • _ - 一个或多个ASCII字母,数字或(?: *[+\/*-] *[a-zA-Z0-9_]+)*
  • *[+/*-] * - 零个或多个序列:
    • [a-zA-Z0-9_]+ - 零个或多个空格,一个运算符,0 +空格,
    • _ - 一个或多个ASCII字母,数字或$
  • / - 字符串结束。

请注意,如果您的正则表达式风格不使用正则表达式分隔符,则无法转义\s。要匹配任何空格,请将模式中的常规空间替换为(?:...)

(?:abc|xyz)构造是non-capturing group。它意味着分组模式,可以是替代(如<?php $query_brands = mysql_query("SELECT distinct pd_filter1 from tbl_brands2 WHERE pd_code in (select pd_code from tbl_product where cat_id='2')") or die(mysql_error()); $count_brands = mysql_num_rows($query_brands); if($count_brands > 0) { while($fetch_brands = mysql_fetch_array($query_brands)) { $record_brands[] = $fetch_brands; } } $i_brands=0; foreach($record_brands as $records_brands) { ?> <table border="1" width="215" style="border-collapse: collapse; border-spacing: 0;" bgcolor="#eeeff0"> <tr> <td> <?php $i_brands = $i_brands + 1; if ($i_brands > 3) { ?> <div id="myDIV_Filter1_1" style="display:none";> <?php } } ?> <div id="myDIV_Filter1_2"> <span class="class22"> <a href="#" onclick="myFunction();return false;">show more...</a> </span> </div> <div id="myDIV_Filter1_3" style="display:none";> <span class="class22"> <a href="#" onclick="myFunction();return false;">show less...</a> </span> </div> </td> </tr> </table> )或量化(如此处),或两者兼而有之。它匹配的值不存储在任何地方,找不到匹配后就无法访问它(与捕获组不同)。