组合多个正则表达式从以下字符串中提取子字符串:

时间:2014-06-19 10:09:46

标签: java regex

我被困一段时间开发一个正则表达式从以下任一字符串中提取路径:

1.  "life:living:fast"
2.  "life"
3.  ":life"
4.  ":life:"

我要使用这些正则表达式:

(.{3,}):", ":(.{3,}):", ":(.{3,})", "(.{3,})

第一场比赛就是我所需要的。即每个所需的结果应该是字生命所在的字符串。认为生命是一个变量

但由于某些原因,将这些单独的正则表达式组合在一起是一种痛苦:如果我按顺序排除它们,我会提取“生命”这个词。但是我无法将它们组合成一个。

感谢您的努力。

2 个答案:

答案 0 :(得分:2)

如果你想要第一个带有冒号的life,你可以使用它:

^:?(?:.{3,}?)(?::|$)

See demo

如果您更喜欢没有冒号的第一个life,请切换到:

((?<=^:)|^)([^:]{3,}?)(?=:|$)

See demo

工作原理#1:^:?(?:.{3,}?)(?::|$)

  • 使用^:?,在字符串的开头,我们匹配一个可选的冒号
  • (?:.{3,}?)懒惰地将三个或更多个字符匹配到...
  • (?::|$)冒号或字符串的结尾

工作原理#1:((?<=^:)|^)([^:]{3,}?)(?=:|$)

  • ((?<=^:)|^)确保我们位于字符串的开头,或者紧跟字符串开头后的冒号
  • ([^:]{3,}?)懒惰地匹配非冒号的字符...
  • 直到前瞻(?=:|$)可以断言后面的内容是冒号或字符串的结尾。

答案 1 :(得分:2)

您可以使用此模式,因为您正在寻找第一个单词:

(?<=^:?)[^:]{3,}

请注意,此模式不会检查所有字符串。