【问题标题】:Need a Regex that extracts a string between two "delimiting" strings [duplicate]需要一个在两个“分隔”字符串之间提取字符串的正则表达式 [重复]
【发布时间】:2016-08-07 18:03:40
【问题描述】:

我需要获取 by__on 之间的字符串。
到目前为止我有这个,但不明白如何截断实际的“字符串分隔符”:
by_(.*)_on

示例输入:
Files_by_wesasegeaazedude_on_January_26.jpg
当前匹配:
by_wesasegeaazedude_on
需要匹配:
wesasegeaazedude

【问题讨论】:

  • Java,但我正在 RegExr.com 上测试它
  • 通常是包含第一个捕获组的第一个索引(不是 0)

标签: java regex


【解决方案1】:

您可以简单地使用积极的环视方法

String regex = "(?<=by_).*(?=_on)";  

这个正则表达式的作用是:

  1. 匹配任何东西:.*
  2. 前面是by_:(?&lt;=by_)
  3. 后跟_on:(?=_on)

【讨论】:

  • 你为什么建议一个低效的模式? OP 有同样的模式,但效率更高。
  • @WiktorStribiżew 因为他说他不想匹配 by__on
  • @Maljam 谢谢!它奏效了
  • 工作与否,任何时候你通过一个断言引导一个正则表达式,你会立即增加 %200 的开销。这可能会增加 %10-20,000,具体取决于接下来是什么。
  • @sln 那么,你建议哪种表达方式?很高兴您了解所有这些技术知识,但大多数情况下更感谢您快速伸出援助之手。
【解决方案2】:

你的表情不错*。您需要做的就是提取第一个捕获组的内容:

Pattern regex = Pattern.compile("by_(.*)_on");
String str = "Files_by_wesasegeaazedude_on_January_26.jpg";
Matcher m = regex.matcher(str);
if (m.find()) {
    String res = m.group(1);
}

Demo.

* 嗯,差不多好了。如果您希望在同一行包含多个文件名的输入,您可能需要考虑使用不情愿的限定符,即by_(.*?)_on

【讨论】:

    【解决方案3】:

    我会在没有正则表达式的情况下这样做。

    int start = str.indexOf("by_");
    int end = str.indexOf("_on", start + 1); // or lastIndexOf("_on"), for greedy match.
    assert start > 0 && end > start;
    String part = str.substring(start + 3, end);
    

    【讨论】:

    • 对于不尝试通过正则表达式制作所有内容的人来说还有一个)
    • @Sasha 我实际上误读了这个问题;但我仍然会在没有正则表达式的情况下这样做:)
    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多