gpt4 book ai didi

regex - Ruby中的条件正则表达式

转载 作者:行者123 更新时间:2023-12-03 16:11:00 24 4
gpt4 key购买 nike

我有以下字符串:

'USD 100'
我基于 this post try catch 100,如果 包含在字符串字符串中,则表示单个(货币)字符(如果字符串中不包含USD)。
例如:
'USD 100' # => '100'
'YEN 300' # => ['Y', 'E', 'N']
到目前为止,我已经做好了准备,但是它没有用:
https://rubular.com/r/cK8Hn2mzrheHXZ
有趣的是,如果我将USD放在看起来可行的数量之后。理想情况下,无论货币字符的位置如何,我都希望具有相同的行为。

最佳答案

您的正则表达式(?=.*(USD))(?(1)\d+|[a-zA-Z])不起作用,因为

  • (?=.*(USD))-正向超前,在字符串(如果使用scan)中的每个位置处触发,该字符串与USD子字符串匹配,且除换行符外的任意0个或更多字符尽可能多(这意味着只有在以下情况下才存在匹配项)某处有USD)
  • (?(1)\d+|[a-zA-Z])-如果第1组匹配(如果有USD),则匹配1个以上数字的条件构造,或者尝试使用ASCII字母。 但是,将永远不会尝试第二种替代模式,因为您需要在字符串中存在USD才能进行匹配。

  • 查看 USD 100 regex debugger,它确切显示了 (?=.*(USD))(?(1)\d+|[a-zA-Z])正则表达式试图找到匹配项时发生的情况:
  • 步骤1至22:先尝试先行模式。这里的要点是,如果正向超前模式未找到匹配项,则匹配项将立即失败。在这种情况下,在字符串的开头找到USD(因为第一次尝试该模式,所以正则表达式索引位于字符串的开头位置)。前瞻找到了匹配项。
  • 步骤23-25:由于先行是非消耗模式,因此正则表达式索引仍位于字符串的起始位置。超前表示“超前”,并输入条件构造。满足(?(1)条件,第1组USD已匹配。因此,第一个then部分被触发。 \d+找不到任何数字,因为开头有U字母。 regex匹配在字符串开始位置处失败,但是字符串中还有更多位置要测试,因为没有\A^ anchor ,只有在字符串的开头找到匹配项时,才会让匹配发生/线。
  • 步骤26:regex引擎索引向右前进一个char,现在,它在字母S之前。
  • 步骤27-40:regex引擎想要找到0+个字符,然后立即在当前位置的右边找到USD,但是失败了(U已经在索引的“后面”)。
  • 然后,执行与上述相同:正则表达式无法在当前位置右侧的任何位置匹配USD并最终失败。

  • 如果 USD100的右侧,那么您将 get a match
    因此, 前瞻不会设置任何搜索范围,它只是允许匹配其余模式(如果其模式匹配)或不匹配(如果未找到其模式)
    您可以使用
    .scan(/^USD.*?\K(\d+)|([a-zA-Z])/).flatten.compact
    模式详细信息
  • ^USD.*?\K(\d+)-字符串开头的USD,然后除换行符以外的任何0个或多个字符尽可能少,然后将匹配的文本删除并将1个以上的数字捕获到第1组
  • |-或
  • ([a-zA-Z])-捕获到组2中的任何ASCII字母。

  • 参见 Ruby demo:
    p "USD 100".scan(/^USD.*?\K(\d+)|([a-zA-Z])/).flatten.compact
    # => ["100"]
    p "YEN 100".scan(/^USD.*?\K(\d+)|([a-zA-Z])/).flatten.compact
    # => ["Y", "E", "N"]

    关于regex - Ruby中的条件正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62728701/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com