【问题标题】:Match strings with line breaks between two characters匹配两个字符之间有换行符的字符串
【发布时间】:2018-08-16 14:13:18
【问题描述】:

如何在 Ruby 中匹配两个星号之间的换行符?我有这个字符串

Foo **bar**
test **hello
world** 12345

我只想找到

**hello
world**

我用\*{1,2}(.*)\n(.*)\*{1,2} 尝试过,但它匹配

**bar**
test **

我玩过像\*{1,2}(.*?)\n(.*?)\*{1,2} 这样的非贪婪匹配器,但这也不起作用,所以我希望有人能提供帮助。

【问题讨论】:

  • 感谢这项工作!
  • 您是否匹配以星号开头和结尾并包含换行符的字符串?如果是这样,除了换行符之外,星号对之间的字符是否有任何限制?例如,它们必须是单词字符,还是允许其他字符,包括或排除其他换行符?换行符可以与星号对的开头或结尾相邻吗?

标签: ruby regex


【解决方案1】:

你可以使用

/\*{1,2}\b([^*]*)\R([^*]*)\b\*{1,2}/

Rubular demo

详情

  • \*{1,2} - 1 或 2 个星号
  • \b - 一个单词边界,下一个字符必须是单词字符
  • ([^*]*) - 第 1 组:除 * 之外的任何 0+ 个字符
  • \R - 换行序列
  • ([^*]*) - 第 2 组:除 * 之外的任何 0+ 个字符
  • \b - 单词边界,前面的 char 必须是单词 char
  • \*{1,2} - 1 或 2 个星号

【讨论】:

    【解决方案2】:

    Wiktor 已经给出了很好的答案。这是另一种方法:

    (?<=\*{1,2})([^*])*(?=\*{1,2})
    

    Tested here

    注意:这在 Ruby 中不起作用,但它可以在某些其他语言中起作用

    来自this answer:中的链接

    look-behind 的子表达式必须是固定宽度的。

    【讨论】:

    • @CarySwoveland 感谢您的来信。我在争论我是否应该留下这个答案,因为它在 Ruby 中不起作用。例如,它可能会帮助需要 JavaScript 类似功能的人。
    猜你喜欢
    • 2014-04-27
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2019-01-12
    • 2013-12-28
    相关资源
    最近更新 更多