【问题标题】:Regular expression to match a pattern either at the beginning of the line or after a space character在行首或空格字符后匹配模式的正则表达式
【发布时间】:2009-11-25 21:12:48
【问题描述】:

我一直试图干掉以下匹配字符串中主题标签的正则表达式,但没有成功:

/^#(\w+)|\s#(\w+)/i

这行不通:

/^|\s#(\w+)/i

不,我不想在开头使用逗号:

/(^|\s)#(\w+)/i

我在 Ruby 中执行此操作 - 尽管我认为这不相关。

举一些匹配和不匹配字符串的例子:

'#hashtag it is'        # should match => [["hashtag"]]
'this is a #hashtag'    # should match => [["hashtag"]]
'this is not a#hashtag' # should not match => []

有什么建议吗?我在吹毛求疵吗?

【问题讨论】:

  • 所以示例 #3 有效,但是您想要一个等效的正则表达式,而开头没有分组作为引导字符?
  • 对于我们当中的愚蠢者,请提供一个示例输入,您想匹配哪个部分,也许还有一个反例。 “字符串中的标签”在我的脑海中不匹配:)

标签: ruby regex


【解决方案1】:

你可以使用。

/\B#(\w+)/i

"this is a #hash tag"      # matches
"#hash tag"                # matches
"this is not#hash tag"     # doesn't match

【讨论】:

  • 所以这是一个非单词边界。巧妙。干燥。谢谢!
  • 这也匹配foo.#bar。不确定 OP 是否想要。
  • 这是一种糟糕的写作风格,但可以假设作者将#bar 作为一个单独的词。我想避免的只是诸如“Object#method”之类的文本,我会假设作者在谈论 Ruby 而不是标签等等。
【解决方案2】:
/(?:^|\s)#(\w+)/i

?: 前缀添加到第一个组将导致它不是一个匹配组,因此只有第二个组实际上是一个匹配组。因此,字符串的每个匹配项都会有一个捕获组,其内容将是主题标签。

【讨论】:

    【解决方案3】:

    这个使用look-behind,不知道Ruby是否支持look-behind(听说JavaScript不支持)

    /(^#(\w+))|((?<= )#(\w+))/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多