我有一个独特的问题陈述,我必须使用三个字符对输入字符串执行正则表达式。例如,如果我的输入是ABCDEFGHI
,则模式搜索BCD
应该返回 false,因为我将输入视为ABC+DEF+GHI
并且需要将我的正则表达式模式与这些三重字符进行比较。
同样,正则表达式模式DEF
将返回true
,因为它匹配三元组之一。使用这个问题陈述,假设我的输入是QWEABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZFGH
,并且我试图获取所有以三元组开头ABC
并以XYZ
. 所以,在上面的输入中,我的输出应该是两个字符串:ABCPOIUYTREWXYZ
和ABCMNBVCXZASXYZ
.
此外,我必须将这些字符串存储在 ArrayList 中。以下是我的功能:
public static void newFindMatches (String text, String startRegex, String endRegex, List<String> output) {
int startPos = 0;
int endPos = 0;
int i = 0;
// Making sure that substrings are always valid
while ( i < text.length()-2) {
// Substring for comparing triplets
String subText = text.substring(i, i+3);
Pattern startP = Pattern.compile(startRegex);
Pattern endP = Pattern.compile(endRegex);
Matcher startM = startP.matcher(subText);
if (startM.find()) {
// If a match is found, set the start position
startPos = i;
for (int j = i; j < text.length()-2; j+=3) {
String subText2 = text.substring(j, j+3);
Matcher endM = endP.matcher(subText2);
if (endM.find()) {
// If match for end pattern is found, set the end position
endPos = j+3;
// Add the string between start and end positions to ArrayList
output.add(text.substring(startPos, endPos));
i = j;
}
}
}
i = i+3;
}
}
在 main 中运行此函数时,如下所示:
String input = "QWEABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZFGH";
String start = "ABC";
String end = "XYZ";
List<String> results = new ArrayList<String> ();
newFindMatches(input, start, end, results);
for (int x = 0; x < results.size(); x++) {
System.out.println("Output String number "+(x+1)+" is: "+results.get(x));
}
我得到以下输出:
Output String number 1 is: ABCPOIUYTREWXYZ
Output String number 2 is: ABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZ
请注意,第一个字符串是正确的。但是,对于第二个字符串,程序再次从输入字符串的开头读取。相反,我希望程序在最后一个结束模式之后读取(即跳过第一个搜索和不需要的字符,例如 ASDFGHJKL,并且应该只将第二个字符串打印为:ABCMNBVCXZASXYZ
感谢您的回复