【问题标题】:RegEx: Capture string without a leading characterRegEx:捕获没有前导字符的字符串
【发布时间】:2026-01-05 08:45:01
【问题描述】:

大家晚上好。

我的字符串:

4x^2+1.5-x
4x^2-x+1.5
1.5+4x^2-x

我想捕捉这些方程中没有“x”或其他符号而不是前面的 +/- 的部分 (1.5)。我试过这个正则表达式:

[^\^](\d+(\.\d+)?)(?!x)

它匹配搜索到的部分,但有一个问题:匹配包含前导 +/-。我以为我可以通过后视来解决这个问题,但由于我使用带有 ECMAScript 的 C++11 库,因此不支持。

有人知道怎么解决吗?

谢谢你:)

【问题讨论】:

  • 你能不能只看第一个子匹配,而不是整个匹配?那将只包括数字。
  • 您能更具体地说明您真正想要什么吗?其中几个 4 和所有 2 后面也没有 x、+ 或 - .. 你也想匹配这些吗?你只是想要字符串中的第一个数字吗?
  • 啊,抱歉回答晚了 :) @CrayonViolent 我想从这些函数中提取常量,它们后面没有“x^n”的数字。因为它们可以出现在任何地方,开始,中间或结尾,它们可以(!)在它们前面有一个'+'/'-'。如果是“+”,则不应该被捕获,但应该是“-”。在这些数字之后,也可以有一个“+”或“-”(很少见,但需要注意)。
  • @IgorTandetnik 其他数字也可以是浮点数,因此它们也会被捕获(如果这是您的意思,不确定)。

标签: c++ regex c++11 ecmascript-5


【解决方案1】:

基于更多 cmets 重写。

好的,根据您的 cmets 中提供的附加标准和说明:

  • 提取后面没有“x^n”的数字。
  • 它们可以出现在任何地方,开头、中间或结尾
  • 他们可以(!)在他们前面有一个'+'/'-'。如果是“+”,则不应该被捕获,但应该是“-”。 (澄清:两者都需要,只需 SHOW -
  • 在这些数字之后,也可以有一个“+”或“-”(很少见,但需要注意)。
  • 重申:不能使用否定的lookbehinds)

(?:[-+]|^)[0-9.]+(?=[-+]|$)

这将匹配以下内容(这里没有格式化和突出显示的好方法,所以我将匹配项包装在 [] 中):

4x^2[+8.15]-x
4x^2-x[+1.25]
[1.9]+4x^2-x
[3]+2x^4-x
x[-6]
[.7]+3x
[-.75]+3x
4x[-0.5]
4x[+0.8]
77x
9.8x
-2.52x^3-4x^2[+1.45]
4x^2[+8.15][-1.5]

你需要去掉前导+

Array
(
    [0] => Array
        (
            [0] => +8.15
            [1] => +1.25
            [2] => 1.9
            [3] => 3
            [4] => -6
            [5] => .7
            [6] => -.75
            [7] => -0.5
            [8] => +0.8
            [9] => +1.45
            [10] => +8.15
            [11] => -1.5
        )
)

【讨论】:

  • 谢谢,但问题是我不能使用lookbehind(见上文),因为ECMAScript 不支持它。
  • @TheFunnyTree 而且,你确定 ECMAScript 不支持lookbehinds 吗?我可以发誓它支持固定宽度的lookbehinds,但不支持可变宽度? 编辑:该死的。做了一些谷歌搜索,你是对的.. 阴暗
  • @TheFunnyTree 你知道,也许我误解了你的第三点。我解释为:“不要捕获前面有 + 的数字。只捕获前面有 - 的数字”。但现在我在想,也许你想同时捕获两者,但只想让数字实际显示给操作员,如果它是 -。 IOW,捕获“-1”和“+1”,但分别给你“-1”和“1”。我原来的解释是对的,还是你真正想要的?
  • 第一组很好,如上所述,'-' 是必需的 ;) 但是关于您使用 []-大括号的示例:有三个字符串,其中带有 '+' 的数字不会得到捕获 - 为什么? 粗体 编辑:是的,这就是重点 ;D
  • @TheFunnyTree 啊哈,好吧.. 重做我的答案。