【问题标题】:Parse string with regex using ordered delimiters使用有序分隔符使用正则表达式解析字符串
【发布时间】:2014-12-17 06:29:18
【问题描述】:

我有一个如下格式的字符串:

University/Class (Term)

我需要把它分成三个部分。我想出了/\/|\s\(|\)/g,这对于简单的情况非常有效。不幸的是,这三个部分中的每一个都可以包含这三个分隔符。例如:

University of StackOverflow (online)/Intro to asking questions (Fall2014)

最好的解决方案(不完美,我知道)似乎是编写一个正则表达式,首先查找\/,然后是\s\(,最后是\),按此顺序。我找到了一些似乎暗示答案的答案,但在我的情况下,我被字符和字符串分隔符的混合所抛弃。

我肯定仍在努力理解一般的正则表达式,所以我非常感谢一个解释清楚的解决方案。谢谢!

【问题讨论】:

  • 如果编辑不正确,请重新编辑。

标签: ruby regex string parsing delimiter


【解决方案1】:
\/|\s\((?!.*\/)|\)(?!.*(?:\/|\s\())

试试这个.Split by this.查看演示。

https://regex101.com/r/eZ0yP4/25

或者如果你愿意使用组,你可以试试这个cn捕获所有组

(.*)\/(.*)\s\(([^\)]+)

查看演示。

https://regex101.com/r/eZ0yP4/26

【讨论】:

  • 谢谢!在什么情况下我应该不愿意使用群组?
  • @ntdb 如果您没有太多复杂的字符串,那么您可以拆分或尝试组
【解决方案2】:

怎么样

> "Universit­y/Class (Term­)".split(/­\s\((?!.*\()­|\)$|\//)
=> ["University", "Class", "Term"]

> "Universit­y of Stack­Overflow (onli­ne)/Intro to askin­g quest­ions (Fall­2014)".spl­it(/\s\((?!.­*\()|\)$|\­//)
=> ["University of StackOverflow (online)", "Intro to asking questions", "Fall2014"]

【讨论】:

    【解决方案3】:

    我建议使用scan 函数而不是split

    > "University/Class (Term)".scan(/.+(?=\/)|[^\/].*?(?=\s\()|[^()]+(?=\))/)
    => ["University", "Class", "Term"]
    > "University of StackOverflow (online)/Intro to asking questions (Fall2014)".scan(/.+(?=\/)|[^\/].*?(?=\s\()|[^()]+(?=\))/)
    => ["University of StackOverflow (online)", "Intro to asking questions", "Fall2014"]
    

    【讨论】:

    • 我不知道scan,感谢您指出。为什么你更喜欢 scan 而不是 split 来实现这个实现?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2019-12-10
    • 2010-11-22
    相关资源
    最近更新 更多