正则表达式可匹配同一行中的多个匹配项,且两者之间带有可选文本

时间:2018-11-24 22:29:30

标签: regex

我是RegEx的童话新手,但是我写了一个能处理大多数用例的正则表达式:

(\d*\.?\-?\d+)\s*\|\s*\[Link\]\(*https:\/\/redd\.it\/(\w+)\/*

...除了一个。我知道这可能会有所改善,以减少贪婪感,而且我愿意接受建议。

RegEx的要旨是捕获一对:

  • 在标准化URL(https://redd.it/ capturethisnext )之前的任何数字(整数或十进制,数字之间包含连字符)。几乎所有情况下都带有“ |”在数字的末尾。有些行可以包含多个数字,这些数字可以与单独的标准化URL配对。

  • 标准化URL的结尾ID:https://redd.it/ capturethisnext 。有些行中可以包含多个URL,这些URL需要与其前一位数字匹配。

链接中的第三行应与 0 相匹配,并且链接的一部分应为 0isamatchandthisisamatch 。我不知道如何使数字和URL之间的所有文本都是可选的,但我认为添加此逻辑可以简化事情。

非常感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

以下是您要匹配的列表:

if (s == "a") { /* ... */ }

通常最好使RegEx尽可能简单。

这是我的RegEx字符串:

1|[Link](https://redd.it/1match)|4.5|[Link](https://redd.it/2match)
3000|[Link](https://redd.it/only1)|[9.5](https//otherlink.com)
0|https://redd.it/0isamatchandthisisamatch
Episode 1 | [Link](https://redd.it/spacesexist)
Episode 1-20 | [Link](https://redd.it/rangeofnumbers)

第一个组在匹配的字符串之前查找并与(?<=\/)(\w+)((?=\))|\n) 匹配,最后一个组与/或换行符匹配。

编辑:

)

在这里,如果您的数据中有(?<=redd\.it\/)(\w+)((?=\))|\n)

或者在这里,如果您确定只想匹配https//otherlink.com/abc之后的第一个单词:

redd.it/

答案 1 :(得分:0)

您似乎应该将[Link]部分设为可选,并添加一些定界字符:

(\d+(?:[.-]\d+)?)[|\]\s]*(?:\[Link\]\()?https:\/\/redd\.it\/(\w+)