【问题标题】:Finding all matching substrings between specific start/end strings in Java在 Java 中查找特定开始/结束字符串之间的所有匹配子字符串
【发布时间】:2017-03-10 15:09:07
【问题描述】:

这是我需要做的:

我有一个很长的字符串,格式为

com.example.TEXT A TO BE EXTRACTED at com.example.TEXT B to be extracted at org.xample.SOME OTHER TEXT at...

我想买

  • TEXT A TO BE EXTRACTED
  • TEXT B TO BE EXTRACTED
  • ...

但不是SOME OTHER TEXT

我不太擅长正则表达式,在 Java 中一点也不擅长。在 JavaScript 中,我可以将第一个匹配项设为

var re = /com\.example\.(.*) at/;
s = 'com.example.abcde at';
var m = s.match(re);

这将产生 àbcdeinm[1]`

我该怎么做

  • 在 Java 中做同样的事情

  • 获取所有匹配项

这里的上下文是一个 Android 应用。我遇到了对 Apache StringUtils 类及其stringbetween 方法的引用。除了我无法找到相关的 JAR 文件这一事实之外,我真的很想避免仅仅为了这个需要而在我的应用程序中添加一个更多的 JAR。

我应该提到我正在使用 Java 8,并且不需要针对低于 Android 4.4.2 的任何东西。

【问题讨论】:

  • 你可以在 Java 中使用这个正则表达式:com\.example\.(.*?) at
  • 惰性点匹配将回答您的第二个问题。第一个在这里回答:Java Regex Capturing Groups.
  • 您的标题似乎与您的问题不匹配——这是关于获取值范围还是匹配模式?
  • 嗯......我想不出更好的标题,但我会尝试一下。我想要做的只是给一个类似于START match this1 END START match this2 END ALTSTART don't match this1 END START match this3 END...的字符串,我想以[match this1,match this2, match this3]结尾来处理我接下来需要做的事情。
  • @anubhava 谢谢。我只是模糊地意识到惰性匹配,但我的印象是它会贪婪并做一个过度匹配?您能否详细说明您的评论?

标签: java android regex java-8


【解决方案1】:

正则表达式不能重复捕获组并一次捕获该组的所有匹配项。包括 Java 在内的正则表达式引擎将允许任意重复捕获组,但只会捕获该组的最后一个匹配项。通过使用循环,您可以从字符串中查找并捕获多个匹配组。

Here is an example of such a loop taken from Oracle documentation:

Pattern pattern = 
Pattern.compile(console.readLine("%nEnter your regex: "));

Matcher matcher = 
pattern.matcher(console.readLine("Enter input string to search: "));

boolean found = false;
while (matcher.find()) {
     console.format("I found the text" +
                " \"%s\" starting at " +
                "index %d and ending at index %d.%n",
                matcher.group(),
                matcher.start(),
                matcher.end());
     found = true;
}
if(!found){
     console.format("No match found.%n");
}

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 2010-11-04
    • 1970-01-01
    • 2017-02-20
    • 2021-11-29
    • 1970-01-01
    • 2016-01-18
    • 2019-02-21
    • 2014-05-22
    相关资源
    最近更新 更多