首页 > 解决方案 > 在两个字符串范围或字符串结尾之间查找字符串

问题描述

我正在尝试提取两个字符串之间的任何内容。第一个字符串是已知字符串,第二个字符串可以来自字符串列表。

例如,

我们有开始字符串和结束字符串。我们想要得到这些之间的文本。

start = "start"
end = ["then", "stop", "other"]

标准

test = "start a task then do something else"
result = "a task"

test = "start a task stop doing something else"
result = "a task"

test = "start a task then stop"
result = "a task" 

test = "start a task"
result = "a task"

我已经研究过使用正则表达式,并且我得到了一个适用于两个字符串之间的,我只是无法创建一个带有字符串选项的单词: (?<=start\s).*(?=\sthen)

我试过使用这个: (?<=start\s).*(?=\sthen|\sstop|\sother) 但这将在比赛中包括“然后,停止或其他”,如下所示: "start a task then stop" will return "a task then"

我还尝试像这样在捕获组中“匹配除结束列表之外的任何字符”:(?<=start\s)((?!then|stop|other).*)(?=\sthen|\sstop|\sother)但这与上面的效果相同。

我正在使用 swift,所以我也想知道这是否可以通过查找两个字符串之间的子字符串来实现。

谢谢你的帮助!

标签: swiftregex

解决方案


您可以使用

(?<=start\s).*?(?=\s+(?:then|stop|other)|$)

请参阅正则表达式演示。要搜索整个单词,请\b在适当的位置添加单词边界:

(?<=\bstart\s).*?(?=\s+(?:then|stop|other)\b|$)

查看另一个正则表达式演示

细节

  • (?<=start\s)start- 与紧接在字符串和空格前面的位置匹配的正向后视
  • .*?- 除换行符以外的任何 0+ 字符,尽可能少
  • (?=\s+(?:then|stop|other)|$)- 字符串中紧随其后的位置
    • \s+- 1+ 空格
    • (?:then|stop|other)- 其中一个词
    • |$ - 或字符串结尾。

推荐阅读