我在下面有一个字符串
ABC+LONDONABC+1200+XX+PP:200'VAN+200+HH:LONDON?'OCP+FFLOAN'TAN+200+HOLANDOCP+NORWAY:1200+LL'OCP+200+500'
如果我在字符串分隔符的基础上拆分此字符串,则会出现四个字符串
1) ABC+LONDONABC+1200+XX+PP:200'
2) VAN+200+HH:LONDON?'OCP+FFLOAN'
3) TAN+200+HOLANDOCP+NORWAY:1200+LL'
4) OCP+200+500'
这个字符串总是单行,这里的事实是整个字符串是多个字符串的组合。所以单引号是一个字符串分隔符。
第二,单引号也可以介于LONDON的子串之间,如下所示?' OCP So?是一个释放角色。
VAN+200+HH:LONDON?'OCP+FFLOAN'
我想只在一行中处理整个字符串。
我的要求是提取从ABC和OCP开始的子串。 ABC总是在字符串中第一个子字符串,而OCP将始终是。
我想要整个字符串中的两个字符串
1) ABC+LONDONABC+1200+XX+PP:200'
2) OCP+200+500'
当我使用带有索引重载的索引从ABC开始提取字符串以获得第一次单引号时,它就会好起来。
但是当我尝试提取OCP的字符串时,如果整个字符串没有任何其他OCP或OCP +或包含OCP +的单词,则可以正常工作。但是,如果像上面提到的字符串...
例如,检查这两个子字符串
TAN+200+HOLANDOCP+NORWAY:1200+LL'
VAN+200+HH:LONDON?'OCP+FFLOAN'
首先,OCP即将进入HOLANDOCP +。这不允许我从OCP +开始到整个字符串结尾的最后一个子字符串。
第二,OCP进入LONDON?' OCP带子串分隔符。
如果我收到上面例子中提到的其他OCP,我如何从整个字符串开始OCP中提取最后一个子字符串到字符串的结尾..?
答案 0 :(得分:0)
如果您遇到单引号始终包围最后一个OCP
短语的情况,您只需split
'
,并获取返回数组中的最后一个元素
String fullStr = "ABC+LONDONABC+1200+XX+PP:200'VAN+200+HH:LONDON?'OCP+FFLOAN'TAN+200+HOLANDOCP+NORWAY:1200+LL'OCP+200+500'";
String[] substrArr = fullStr.split("'");
String substr = substrArr[substrArr.length - 1];
System.out.println(substr); // will output OCP+200+500
答案 1 :(得分:0)
您可以使用扫描仪执行此操作。首先你说子串由'分隔,所以你可以使用它将字符串标记为字符串,然后保留第一个和最后一个字符串。
import java.util.Scanner;
public class Sample
{
public static void main(String[] args)
{
String input = "ABC+LONDONABC+1200+XX+PP:200'VAN+200+HH:LONDON?'OCP+FFLOAN'TAN+200+HOLANDOCP+NORWAY:1200+LL'OCP+200+500'";
Scanner scanner = new Scanner(input);
scanner.useDelimiter("'");
String first = "";
if (scanner.hasNext()) first = scanner.next();
System.out.println(first);
String last = "";
while (scanner.hasNext())
last = scanner.next();
System.out.println(last);
}
}
我不确定这是不是你想要的。从你的问题我也明白,也许从ABC开始的字符串并不总是第一,但如果是这种情况,那么你可以迭代每个子字符串并检查它是否包含“ABC”或“OCP”。
答案 2 :(得分:0)
正则表达式在处理此类事情方面非常强大。这是一个可能的解决方案:
List<String> matches = new ArrayList<>();
String test = "ABC+LONDONABC+1200+XX+PP:200'VAN+200+HH:LONDON?'OCP+FFLOAN'TAN+200+HOLANDOCP+NORWAY:1200+LL'OCP+200+500'";
Matcher matcher = Pattern.compile("(\\A|[^\\?]')(((ABC|OCP).*?)(\\z|[^\\?]'))").matcher(test);
while (matcher.find()) {
matches.add(matcher.group(2));
}
System.out.println(matches);
输出:
[ABC+LONDONABC+1200+XX+PP:200', OCP+200+500']
正则表达式有三个部分:
(\\A|[^\\?]')
表示输入的开头或“没有前面的?”。((ABC|OCP).*?)
用于查找以ABC或OCP开头的部分。(\\z|[^\\?]')
是找到输入的结尾还是'没有先于??中间和末尾附近有一组额外的括号,因此它将包含结尾',就像你在所需输出中指定的一样。如果你不想'最后,你可以删除那些括号。