这个问题一直困扰着我很长一段时间,但基本上我正在寻找最有效的方法来获取两个字符串之间的所有字符串。
我现在已经使用了很多个月的方法是使用一堆临时索引,字符串,子串,而且它真的很乱。 (为什么Java没有String substring(String start, String end)
等本机方法?
说我有一个字符串:
abcabc [pattern1]foo[pattern2] abcdefg [pattern1]bar[pattern2] morestuff
最终目标是输出foo
和bar
。 (后来被添加到JList中)
我一直试图在.split()
中加入正则表达式,但还没有成功。我已尝试使用*
和.
的语法,但我不认为这是我的意图,特别是因为.split()
只需要一个参数来分割。
否则我认为另一种方法是使用Pattern和Matcher类?但是我对相应的程序非常模糊。
答案 0 :(得分:76)
您可以构建正则表达式来为您执行此操作:
// pattern1 and pattern2 are String objects
String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);
这会将pattern1
和pattern2
视为文字文字,并在第一个capturing group中捕获模式之间的文字。如果您想使用正则表达式,可以删除Pattern.quote()
,但如果您这样做,不保证任何内容。
您可以通过向regexString
添加标记来添加对匹配应如何进行的自定义。
(?iu)
的开头添加regexString
,或者向Pattern.compile
方法提供Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE
标记。(?s)
之前添加(.*?)
,即"(?s)(.*?)"
,或提供Pattern.DOTALL
标记Pattern.compile
方法。然后编译正则表达式,获取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
答案 1 :(得分:10)
这是一个完成所有工作的单行程序:
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]
答案 2 :(得分:9)
试试这个:
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 <
> <