正则表达式匹配多个子串

Regular expression match multiple substring

我写了一个正则表达式来测试一个字符串是否是逻辑表达式。这是正则表达式:

/(.*)(<|>|<=|>=|=|!=)(.*)/

这是我用上面的表达式测试的主题:

3!=2

preg_match_all函数在PHPreturn以下数组:

[
  [
    "3!=2"
  ],
  [
    null
  ],
  [
    "="
  ],
  [
    "2"
  ]
]

我得到了一个错误的逻辑运算符,因为它不仅匹配 = 模式,而且还匹配 != 运算符。我应该如何重写正则表达式以不匹配括号中的多个字符串?

您应该排除运算符前的 <>! 和运算符后的 =。然后,为了缩短,将运算符分组更紧密。

([^<>!]*)([<>]=?|!?=)([^=]*)

你也可以这样缩短它:

(\w+)([<>]=?|!?=)(\w+)

<=>,用

([^<>!]*)(<=>|[<>]=?|!?=)([^=>]*)

或者,在某些情况下更好,

(\w+)(<=>|[<>]=?|!?=)(\w+)

.*正在吃掉!。使 .* 特定于您不希望它匹配的运算符。我认为:

([^!<>=]+)(<|>|<=|>=|!=|=)(.*)

应该做。

演示:https://regex101.com/r/yM5aY8/1

或者如果您只处理数字,请使用 \d+.

演示 2:https://regex101.com/r/yM5aY8/2

如果表达式

的两边都有digits/variableName,而不是仅在开头和结尾使用.*,请尝试'\w.*'
(\w.*)(<|>|<=|>=|=|!=)(\w.*)