indexOf字符串中的特定单词

时间:2017-05-30 14:30:44

标签: java string indexof

我在下面有一个字符串

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中提取最后一个子字符串到字符串的结尾..?

3 个答案:

答案 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']

正则表达式有三个部分:

  1. (\\A|[^\\?]')表示输入的开头或“没有前面的?”。
  2. 中间部分((ABC|OCP).*?)用于查找以ABC或OCP开头的部分。
  3. 最后一部分(\\z|[^\\?]')是找到输入的结尾还是'没有先于??
  4. 中间和末尾附近有一组额外的括号,因此它将包含结尾',就像你在所需输出中指定的一样。如果你不想'最后,你可以删除那些括号。