【问题标题】:How to split a sting into groups where the regular expression is true如何将字符串拆分为正则表达式为真的组
【发布时间】:2021-10-10 17:19:51
【问题描述】:

我得到一个方程(多项式)作为字符串,我正在尝试使用正则表达式将方程分成表达式为真的组。

到目前为止我所拥有的:

>>> str = "13x^14-12x^3+x^3-11"
>>> puts str.split(/[+-]?\d*x?\^?\d*/)
["13x^14-12x^3+x^3-11"]

我想要得到的东西: ["13x^14","-12x^3","+x^3","-11"]

我的表达方式是怎样的

  • [+-]? : + 或 - 可以存在 0 或 1 次
  • \d* : 数字 0-9 可以出现 0 到无限次
  • x? : x 可以出现 0 次或 1 次
  • ^? : 字符 ^ 可以出现 0 次或 1 次
  • \d* : 数字 0-9 可以出现 0 到无限次

【问题讨论】:

  • 从模式的开头和结尾删除 ^$[+-]?\d*x?\^?\d*
  • 如果我删除 ^$ 一个空数组返回

标签: regex ruby


【解决方案1】:

如果您使用 gsub 将 + 和 - 符号替换为“|+”和“|-”,那么您可以使用 split("|") 来获取该信息。您不需要正则表达式来拆分字符串。

str = "13x^14-12x^3+x^3-11"
str.gsub(/[+]/,"|").gsub(/[-]/,"|-").split("|")
["13x^14","-12x^3","x^3","-11"]

【讨论】:

    【解决方案2】:

    您可以匹配所有匹配项并省略锚点^$,而不是使用拆分

    由于所有匹配项都以数字结尾,因此您可以更改最后部分以匹配至少 1 个或多个数字 \d+ 以防止出现空匹配项,因为所有部分都是可选的。

    str = '13x^14-12x^3+x^3-11'
    
    str.scan(/[+-]?\d*x?\^?\d+/) do |match|
        puts match.to_s
    end
    

    输出

    13x^14
    -12x^3
    +x^3
    -11
    

    【讨论】:

      【解决方案3】:

      如果您使用正则表达式并将分隔符放在组内,split 也会捕获分隔符。 Source

      str.split(/([+-]?\d*x?\^?\d*)/) - [""]
      

      【讨论】:

      • 这仍然返回一个空列表
      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2018-06-16
      相关资源
      最近更新 更多