【问题标题】:Select a string in regex with ruby使用 ruby​​ 在正则表达式中选择一个字符串
【发布时间】:2018-09-19 01:49:27
【问题描述】:

我必须清理传入参数的字符串,并删除所有小写字母和所有特殊字符,除了:

  • +
  • |
  • ^
  • 空间
  • =>

所以我在参数中传递了这个字符串:

aA azee + B => C=

我需要清理这个字符串才能得到这个结果:

A + B => C

我愿意

string.gsub(/[^[:upper:][+|^ ]]/, "")

输出:"A + B C"

我不知道如何使用 ruby​​ 中的正则表达式选择 =>(以及 <=>)字符串)

我知道如果我将 string.gsub(/[^[:upper:][+|^ =>]]/, "") 添加到我的正则表达式中,我的字符串中的最后一个 = 会传入参数也会被选中

【问题讨论】:

  • (<?=>)|[^[:upper:]+|^ ] 替换为$1?
  • 为什么你的字符串包含那些多余的字符?

标签: ruby regex rubular


【解决方案1】:
r = /[a-z\s[:punct:]&&[^+ |^]]/

"The cat, 'Boots', had 9+5=4 ^lIVEs^ leF|t.".gsub(r,'')
  #=> "T  B  9+54 ^IVE^ F|"

正则表达式读取,“匹配不是字符'+'' ''|''^' 的小写字母、空格和标点符号。字符类中的&&集交集 运算符。在这里,它将匹配a-z\s[:punct:] 的字符集与匹配[^+ |^] 的字符集相交。(请注意,这包括空格以外的空格。)有关更多信息,请搜索“字符类也支持 &&运算符”在Regexp

我没有包含 '=>''<=>',因为它们与 '+'' ''|''^' 不同,它们是多字符串,因此需要一种不同的方法,而不是简单地删除某些字符.

【讨论】:

    【解决方案2】:

    您可以尝试另一种方法:匹配您想要保留的所有内容,然后加入结果。

    您可以使用此正则表达式来匹配您想要保留的所有内容:

    [A-Z\d+| ^]|<?=>
    

    如您所见,这只是使用|[] 创建要保留的字符串列表:大写、数字、+、|、空格、^、=> 和 。

    例子:

    "aA azee + B => C=".scan(/[A-Z\d+| ^]|<?=>/).join()
    

    输出:

    "A  + B => C"
    

    请注意,“A”和“+”之间有 2 个连续的空格。如果你不想这样,你可以打电话给String#squeeze

    【讨论】:

    • join 不需要显式传递默认参数,之后 squeezing 可能会有意义。
    • 这仍然是 AFAICT 的最佳方法。
    • 谢谢,我认为这是解决我问题的最佳方法!
    • 我认为正则表达式还应该包含\d
    • /[A-Z\d+| ^]|&lt;?=&gt;/ 更快,还包括您忘记的^ 字符:)
    【解决方案3】:

    See regex in use here

    (<?=>)|[^[:upper:]+|^ ]
    
    • (&lt;?=&gt;) 捕获 &lt;=&gt;=&gt; 到捕获组 1
    • [^[:upper:]+|^ ] 匹配任何不是大写字母(与[A-Z] 相同)或+|^ 或空格的字符

    See code in use here

    p "aA azee + B => C=".gsub(/(<?=>)|[^[:upper:]+|^ ]/, '\1')
    

    结果:A + B =&gt; C

    【讨论】:

    • 我更喜欢这种解决方案,因为它明确排除了字符,而不是包括推断为要保留的字符串。此外,大写字母的 POSIX 表达式比A-Z 具有更广泛的适用性。
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 2022-11-18
    • 2022-01-20
    • 2012-02-17
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多