【问题标题】:How to find string which is started with ".."?如何找到以“..”开头的字符串?
【发布时间】:2013-02-04 20:51:47
【问题描述】:

我试图找出后面只有“..”的字符串,但找不到:

["..ab","...cc","..ps","....kkls"].each do |x|
puts x if /../.match(x)
end
..ab
...cc
..ps
....kkls
=> ["..ab", "...cc", "..ps", "....kkls"]

["..ab","...cc","..ps","....kkls"].each do |x|
puts x if /(.)(.)/.match(x)
 end
..ab
...cc
..ps
....kkls
=> ["..ab", "...cc", "..ps", "....kkls"]

预期输出:

["..ab","..ps"]

【问题讨论】:

  • 您的意思是字符串正好以 2 个(并且没有更多)句点开头吗?
  • 记住这一点。是特殊字符,需要在正则表达式中转义:\.
  • @iamnotmaynard - 是的,我希望字符串开头只有 2 个句点。

标签: ruby regex


【解决方案1】:

你想要的是

/^\.\.(?!\.)/

开头的插入符号^表示匹配字符串的开头;句点必须用反斜杠转义为\.,因为在正则表达式中,纯句点. 匹配任何字符; (?!\.) 是负前瞻,表示下一个字符不是句点。所以表达式的意思是,“在字符串的开头,匹配两个句点,后面必须跟一个不是句点的字符。”

>> /^\.\.(?!\.)/.match "..ab"
=> #<MatchData "..">
>> /^\.\.(?!\.)/.match "...cc"
=> nil

【讨论】:

  • 你能解释一下你的代码在这种匹配中是如何工作的吗?
  • \.因为您必须转义点(就像 * 表示正则表达式,选择任何内容)。所以基本上是“string_start:dot dot (not dot) anything else”阅读一些正则表达式基础知识很容易。还有一些正则表达式否定:stackoverflow.com/questions/3977455/…
【解决方案2】:

尝试选择/^\.\.[^\.]/(以两个点开头,然后不是一个点)。

ss = ["..ab","...cc","..ps","....kkls"]
ss.select { |x| x =~ /^\.\.[^\.]/ } # => ["..ab", "..ps"] 

【讨论】:

  • 您能解释一下您的代码,它是如何忽略以超过 2 个. 句点开头的字符串的吗?
【解决方案3】:

尝试使用/^\.{2}\w/ 作为正则表达式。

快速解释: ^ 表示字符串的开头。没有这个,它可以匹配字符串中间的点。

\. 转换为 . -- 如果您单独使用点,它将匹配任何非换行符

{2} 表示您正在寻找其中两个点。 (您可以将/\.{2}/ 重写为/\.\./)

最后,\w 匹配任何单词字符(字母、数字、下划线)。

一个非常好的测试 Ruby 正则表达式的地方是 http://rubular.com/——它可以让您在浏览器中使用正则表达式并对其进行测试。

【讨论】:

    【解决方案4】:

    您根本不需要正则表达式,您只需使用String#[] 或String#slice 提取适当的前导块并进行简单的字符串比较:

    >> a = ["..ab", "...cc", "..ps", "....kkls", ".", "..", "..."]
    >> a.select { |s| s[0, 2] == '..' && s[0, 3] != '...' }
    => ["..ab", "..ps", ".."]
    

    【讨论】:

    • 重点是当简单的字符串操作就可以时,你不必使用正则表达式。
    【解决方案5】:

    也许是这样的:

    ["..ab","...cc","..ps","....kkls"].each {|x| puts x if /^\.{2}\w/.match(x) }
    

    或者,如果您想确保 .不匹配:

    ["..ab","...cc","..ps","....kkls"].each {|x| puts x if /^\.{2}[^\.]/.match(x) }
    

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2012-12-04
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      相关资源
      最近更新 更多