这个问题已经困扰我很久了,但从本质上讲,我正在寻找一种最有效的方法来抓取两个Strings之间的所有Strings。
我已经做了很多个月的方法是通过使用一堆临时索引、字符串、子串,真的很乱。(为什么Java没有一个原生的方法,如 String substring(String start, String end)
?
说我有一个字符串。
abcabc [pattern1]foo[pattern2] abcdefg [pattern1]bar[pattern2] morestuff
最终目标是输出 foo
和 bar
. (以后还要加到一个JList中)
我一直在尝试将 regex 纳入到 .split()
但一直没有成功。我试过用 *
的和 .
但我认为这不是我的本意,特别是由于... .split()
只需要一个参数就可以拆分反对。
否则我觉得还有一种方法就是使用Pattern和Matcher类?但是我真的很模糊,不知道合适的程序。
你可以构造一个regex来为你做这件事。
// pattern1 and pattern2 are String objects
String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);
这将处理 pattern1
和 pattern2
作为 字面 文本,而图案之间的文本则被捕捉到,在第一个 捕捉群体. 您可以删除 Pattern.quote()
如果你想使用regex,但我...。不要 保证任何事情,如果你这样做。
你可以通过向 regexString
.
(?iu)
一开始 regexString
或供应 Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE
旗帜鲜明 Pattern.compile
方法。(?s)
之前 (.*?)
即 "(?s)(.*?)"
或供应 Pattern.DOTALL
旗帜鲜明 Pattern.compile
方法。然后编译regex,获得一个 Matcher
对象,遍历这些匹配的对象,并将它们保存到一个名为 List
(或任何 Collection
,由您决定)。)
Pattern pattern = Pattern.compile(regexString);
// text contains the full text that you want to extract data
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
String textInBetween = matcher.group(1); // Since (.*?) is capturing group 1
// You can insert match into a List/Collection here
}
测试代码。
String pattern1 = "hgb";
String pattern2 = "|";
String text = "sdfjsdkhfkjsdf hgb sdjfkhsdkfsdf |sdfjksdhfjksd sdf sdkjfhsdkf | sdkjfh hgb sdkjfdshfks|";
Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2));
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(1));
}
请注意,如果你搜索的文本之间的 foo
和 bar
在此输入 foo text foo text bar text bar
用上面的方法,你会得到一个匹配,那就是 text foo text
.
这里有一句话,可以说是一语道破天机。
List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "")
.split("pattern2.*?(pattern1|$)"));
具体操作是:
.*?
)之间Arrays.asList()
以产生 List<String>
下面是一些测试代码。
public static void main( String[] args ) {
String input = "abcabc pattern1foopattern2 abcdefg pattern1barpattern2 morestuff";
List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "").split("pattern2.*?(pattern1|$)"));
System.out.println( strings);
}
输出:
[foo, bar]
试试这个
String str = "its a string with pattern1 aleatory pattern2 things between pattern1 and pattern2 and sometimes pattern1 pattern2 nothing";
Matcher m = Pattern.compile(
Pattern.quote("pattern1")
+ "(.*?)"
+ Pattern.quote("pattern2")
).matcher(str);
while(m.find()){
String match = m.group(1);
System.out.println(">"+match+"<");
//here you insert 'match' into the list
}
它打印出来了
> aleatory <
> and <
> <