我有一个这样的句子:
Hello @[Pratha](user:1), did you see @[John](user:3)'s answer?
我想要得到的是@[Pratha](user:1)
和@[John](user:3)
。它们的名称和ID或与我引用的文本一样,以便我自己爆炸并解析名称和ID。
但是这里有一个问题。名称Pratha
和John
可以包含非abc字符,例如'
,,
,-
,+
等,但不能{ {1}}和[]
到目前为止我尝试过的事情:
()
但没有成功。
答案 0 :(得分:3)
您可以使用
/@\[([^\]\[]*)\]\([^()]*:(\d+)\)/
详细信息
@
-一个@
字符\[
-一个[
([^\]\[]*)
-第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次\)
匹配)