You can construct the regex to do this for you:
// pattern1 and pattern2 are String objects
String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);
This will treat the pattern1
and pattern2
as literal text, and the text in between the patterns is captured in the first capturing group. You can remove Pattern.quote()
if you want to use regex, but I don't guarantee anything if you do that.
You can add some customization of how the match should occurs by adding flags to the regexString
.
- If you want Unicode-aware case-insensitive matching, then add
(?iu)
at the beginning of regexString
, or supply Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE
flag to Pattern.compile
method.
- If you want to capture the content even if the two delimiting strings appear across lines, then add
(?s)
before (.*?)
, i.e. "(?s)(.*?)"
, or supply Pattern.DOTALL
flag to Pattern.compile
method.
Then compile the regex, obtain a Matcher
object, iterate through the matches and save them into a List
(or any Collection
, it's up to you).
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
}
Testing code:
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));
}
Do note that if you search for the text between foo
and bar
in this input foo text foo text bar text bar
with the method above, you will get one match, which is ?text foo text?
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…