【问题标题】:Ruby RegEx issue红宝石正则表达式问题
【发布时间】:2011-10-06 10:28:59
【问题描述】:

我在让我的 RegEx 与我的 Ruby 脚本一起工作时遇到问题。

这是我要匹配的内容:

http://my.test.website.com/{GUID}/{GUID}/

这是我测试过的正则表达式,应该与上面显示的字符串匹配:

/([-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)([\/\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/\/])*?\/)/

3 个捕获组:

group 1: ([-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)([\/\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/\/])*?\/)
group 2: (\/[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)
group 3: ([\/\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/\/])

在尝试验证与此正则表达式的匹配时,Ruby 给了我一个错误:

empty range in char class: (My RegEx goes here) (SyntaxError)

感谢您对此的任何想法或建议。

【问题讨论】:

  • 我猜 Ruby 不喜欢 ...[-a-... 中的第一个 -
  • @Jacob 听起来很合理。 @r3nrut,尝试将 - 移到末尾。
  • 我尝试从 alpha 匹配项中删除初始破折号,但没有任何区别。不过感谢您的建议。
  • 不,破折号在[] 内时通常是一个范围符号,因此它必须排在第一位才能算作破折号(或第二个,紧跟在^ 字符类否定修饰符之后)

标签: ruby regex rspec


【解决方案1】:

您可以通过使用 URI 处理解析 URL、使用正则表达式中的 \h 和提取 GUID 的 scan 来简化一些事情:

uri   = URI.parse(your_url)
path  = uri.path
guids = path.scan(/\h{8}-\h{4}-\h{4}-\h{4}-\h{12}/)

如果您需要 URL 的任何非路径组件,您可以轻松地将它们从 uri 中提取出来。

您可能需要根据您的数据稍微收紧,或者检查guids 是否有两个元素可能就足够了。

【讨论】:

    【解决方案2】:

    您的 RegEx 中有几个错误。我现在很困,所以我只是给你一个提示而不是解决方案:

    ...[\/\/[0-9a-fA-F]....
    

    第一个[ 不属于那里。此外,在[] 中包含\/\/ 是不必要的——您只需要在[] 中使用每个字符一次。还有,

    ...[-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}...
    

    是贪婪的,并且包括一个句点 - 实际上,包括所有可以在它之后出现的字符(AFAICS),有效地吞下整个字符串(当你摆脱其他错误时)。请考虑使用{2,256}?

    【讨论】:

    • 你是对的。原来的 RegEx 很糟糕。我做了一些改变,并以一种不那么复杂的方式看待它,这就是我想出的。到目前为止,它似乎像我需要的那样工作,而 Ruby 并没有把它扔掉。感谢帮助。 /([-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)[\/]([0-9a-fA-F]{8}-[0 -9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}) [\/]([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA -F]{4}-[0-9a-fA-F]{12})/
    猜你喜欢
    • 2016-12-14
    • 2019-04-22
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多