【问题标题】:Regular expression for mathematical expression and logical with groups数学表达式和逻辑与组的正则表达式
【发布时间】:2017-01-30 19:26:22
【问题描述】:

我有这个正则表达式:

/(?:\-?[0-9a-zA-Z]+(?:\.?[0-9a-zA-Z]+)?+[\+\-\*\/\<\>\=])+\-?[0-9a-zA-Z]+(?:\.?[0-9a-zA-Z]+)?/

问题是我需要这个表达式可以解码的 n 组,但我不知道如何更改它。

我使用https://regex101.com/进行编辑,并删除了导致表达式无法正确匹配的?:

常规输入类似于1+2-b*4/c or 1+a=3-b

我需要的答案是这样的

full match[0] = 1+a=3-b

group[1] = '1'
group[2] = '+'
group[3] = 'a'
group[4] = '='
group[5] = '3'
group[6] = '-'
group[7] = 'b'

【问题讨论】:

  • 你可以使用 2 个正则表达式(你的正则表达式用于验证,然后 "\d+" 用于获取所有组号)。
  • 不只是单个字符,我使用像“字符串”这样的字符串或像 12 或 12.3 这样的数字,这个正则表达式匹配这种类型的输入,但我无法创建组以供以后操作@chris85跨度>
  • @chris85,谢谢老兄,这正是我想要的。

标签: php regex


【解决方案1】:

你可以稍微简化一下这个表达式。另请注意,您的字符类中唯一需要转义的字符是-,将其移至第一个/最后一个字符具有相同的效果。这个正则表达式应该完成你所追求的:

[a-z]+|(?:\d+(?:\.\d+)?)|[-+/*=]

搜索连续(至少 1 个)小写字母字符、连续数字(可能有小数)或任何(大多数?)数学运算。由于这些单独的规则,每个查找都将是一个匹配项。

PHP 用法:

foreach(array('12.3+22-this*4/varable','1+a=3-b') as $equat) {
    preg_match_all('~[a-z]+|(?:\d+(?:\.\d+)?)|[-+/*=]~', $equat, $matches);
    print_r($matches[0]);
}

PHP 演示:https://eval.in/727124

正则表达式演示:https://regex101.com/r/0mTL6d/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多