如何在这句话中使用Ruby Regex解析用户名,ID或整个部分?

时间:2018-11-23 13:40:26

标签: ruby regex

我有一个这样的句子:

Hello @[Pratha](user:1), did you see @[John](user:3)'s answer?

我想要得到的是@[Pratha](user:1)@[John](user:3)。它们的名称和ID或与我引用的文本一样,以便我自己爆炸并解析名称和ID。

但是这里有一个问题。名称PrathaJohn可以包含非abc字符,例如',-+等,但不能{ {1}}和[]

到目前为止我尝试过的事情:

()

但没有成功。

3 个答案:

答案 0 :(得分:3)

您可以使用

/@\[([^\]\[]*)\]\([^()]*:(\d+)\)/

请参见the regex demo

详细信息

  • @-一个@字符
  • \[-一个[
  • ([^\]\[]*)-第1组:除了[]之外的0个字符以上
  • \]-一个]字符
  • \(-一个(字符
  • [^()]*-除()以外的0多个字符
  • :-冒号
  • (\d+)-第2组:1个或更多数字
  • \)-一个)字符。

示例Ruby code

s = "Hello @[Pratha](user:1), did you see @[John](user:3)'s answer?"
rx = /@\[([^\]\[]*)\]\([^()]*:(\d+)\)/
res = s.scan(rx)
puts res
# = > [["Pratha", "1"], ["John", "3"]]

答案 1 :(得分:1)

"Hello @[Pratha](user:1), did you see @[John](user:3)'s answer?".scan(/@.*?\)/)
#⇒ ["@[Pratha](user:1)", "@[John](user:3)"]

由于该行不是来自用户输入的,因此您可以依靠感兴趣的部分以@开头和以)结尾。

答案 2 :(得分:1)

您可以使用2个捕获组来获取名称和ID:

@\[([^]]+)]\([^:]+:([^)]+)\)

这将匹配

  • @字面上匹配
  • \[匹配[
  • ([^]]+)第一个捕获组,使用否定的字符类,匹配不超过1次以上。
  • \(字面上匹配
  • [^:]+:不匹配:,然后匹配:
  • ([^)]+)第二个捕获组,匹配次数不超过) 1次
  • \)匹配)

Regex demo | Ruby demo