【问题标题】:How to write a hashtag matching regex如何编写匹配正则表达式的主题标签
【发布时间】:2015-03-20 09:12:24
【问题描述】:

我在编写一个选择所有正确标签的正则表达式(在 Ruby 中,但我认为它不会改变任何东西)时遇到问题。

我使用了( /(^|\s)(#+)(\w+)(\s|$)/ ),但它不起作用,我不知道为什么。

在这个例子中:

#start #middle #middle2 #middle3 bad#example #another#bad#example #end

它应该标记#start#middle#middle2#middle3#end

为什么我的代码不起作用?正确的正则表达式应该是什么样子?

【问题讨论】:

  • 我投票结束这个问题,因为它是一个代码请求。
  • 不是 - 主要问题是为什么我的代码不起作用 - 这里有很多这样的问题。
  • 如果有很多这样的问题isn't this a duplicate?
  • 我不是那个意思,但是......对 - 它看起来与您链接的那个非常相似。仍然很高兴了解我的代码有什么问题:D(但据看来没有人关心第一个问题)

标签: ruby regex


【解决方案1】:

至于为什么原来的不起作用,让我们看看每个位

  1. (^|\s) 行首或空格
  2. (#+)一个或多个#
  3. (\w+) 一个或多个字母数字字符
  4. (\s|$) 空格或行尾

主要问题是 1 和 4 之间的冲突。当 1 匹配空白时,该空白已在最后一组中匹配为第 4 部分。因此 1 不存在,匹配移动到下一个可能

4 并不是真正需要的,因为 3 不会匹配空白。

结果如下

(?:^|\s)#(\w+)

https://regex101.com/r/iU4dZ3/3

【讨论】:

  • 它匹配 bad#example 而它不应该。
  • 哎呀,虽然很容易解决
  • 最干净最短的解决方案。
【解决方案2】:

[^#\w](#[\w]*)|^(#[\w]*) 有效吗?

得到一个不跟随字符的#,并捕获所有内容,直到没有一个单词。

or case 处理第一个字符为# 的情况。

现场演示:http://regexr.com/3al01

【讨论】:

  • 谢谢,看起来不错,但还有一个条件(我不久前更改了它) - 在这种情况下它不应该标记任何东西:#xxx#yyy
  • 嗯.. 对,我也在考虑,但这取决于你想要什么,比如.. 给定#xxx#yyy,整个事情是否有效?或不?还是只有#xxx 有效?
  • 散列周围应该有空格,所以只有 #xxx 可以(顺便说一句 - 你知道我的代码有什么问题吗?)
  • 我认为是因为空格。你得到^start 并留下不以空格开头的#middle #middle2 #middle3 bad#example #end,它不是行首,所以它跳到下一个空格以匹配space hash some_number_of_char space,并且只使用SPACE#middle2SPACE
  • 我不会说这是正确的做法,但我通常会抓取不是空格的字符,因此它会尽可能多地抓取,直到遇到空格。像#[^\s]* 一个哈希标签,后面跟不是空格字符,直到下一个空格
【解决方案3】:

这对你有什么好处?

(#[^\s+]+)

这表示找到一个哈希标签,然后找到一个空格。

【讨论】:

  • 不,匹配bad#example
  • 好吧,这个应该比。 (^|\s+)(#[^\s+]+)
【解决方案4】:

还有一个正则表达式:

\B#\w+\b

这个不捕获空格...

https://regex101.com/r/iU4dZ3/4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多