【问题标题】:Regex with prefix and optional suffix带有前缀和可选后缀的正则表达式
【发布时间】:2017-02-05 00:05:10
【问题描述】:

这可能是关于 SO 上的正则表达式可选后缀的 100+1 问题,但我没有找到任何可以帮助我的问题:(

我需要从通用模式中提取一部分字符串:

prefix/s/o/m/e/t/h/i/n/g/suffix

使用正则表达式。 前缀是不变的,后缀可能根本不会出现,所以prefix/(.+)/suffix不符合我的要求。模式 prefix/(.+)(?:/suffix)? 返回 s/o/m/e/t/h/i/n/g/suffix(?:/suffix)? 的部分一定更贪婪。

我想从这些输入字符串中得到s/o/m/e/t/h/i/n/g

prefix/s/o/m/e/t/h/i/n/g/suffix
prefix/s/o/m/e/t/h/i/n/g/
prefix/s/o/m/e/t/h/i/n/g

提前致谢!

【问题讨论】:

  • 如果这是整个字符串,你可以使用^prefix(.*?)(?:\/(?:suffix)?)?$作为一般模式,不确定java中的具体实现(和正确的转义)。
  • 是的,非常感谢!请把它作为答案
  • 输入是否允许在匹配之前或之后包含字符,例如...prefix/s/o/m/e/t/h/i/n/g/suffix...
  • @Thomas 不,字符串是严格前缀的。如果有的话,后缀也是严格的。刚刚发布了正确的模式。看看之前的评论

标签: java regex regex-greedy


【解决方案1】:

试试

prefix\/(.+?)\/?(?:suffix|$)

正则表达式需要知道匹配何时完成,因此匹配 either suffix 或行尾 ($),并使捕获 非贪婪 .

See it here at regex101.

【讨论】:

  • 这与下一个示例不匹配 - prefix/s/o/m/e/t/h/i/n/g/suffixandmore
【解决方案2】:

如果prefix 之前或suffix 之后允许有字符,请尝试prefix(.*?)(?:/?(?:suffix|$))

这要求匹配尽可能短(不情愿的量词),并且前面有 3 件事之一:输入结束前的单个斜线、/suffix 或输入结束。这将与您提供的测试用例中的/s/o/m/e/t/h/i/n/g 匹配,但会更匹配prefix/s/o/m/e/t/h/i/n/g/suff 之类的输入(这在IMO 中是可以的,因为您不知道/suff 是要成为匹配的一部分还是在后缀)。

【讨论】:

  • 那只会使后缀中的x 成为可选的。
  • @ClasG 你是对的,我会解决的。也忘了/
  • 由于贪婪匹配,第一组总是会消耗整个字符串。
  • 我建议你在发布它们之前在 regex101 或类似的地方测试你的 RE;)这也不起作用 - see here
  • @ClasG 我测试了它,但我的测试工具欺骗了我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多