2017-01-16 93 views
1

在这里我有下面的代码。这个想法是,如"R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW"短语返回一个模式像返回相同的字符串中找到的子串

"#GUPW*"
"#WERTY*"
"#LLOPPPPER*"

是从与#开头,以*结尾那句返回所有的子字符串。所以在这个短语中有3个。

import java.io.*; 

public class Pattern { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 

     String phrase = "R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW"; 
     String found =""; 

     for (int y = 0; y<phrase.length(); y++) 
     { 
     found = found + phrase.substring(phrase.indexOf("#"), phrase.indexOf("*")); 
     } 
     System.out.println(found); 
    } 

} 

,但我的代码返回 "#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW"

我怎么能返回这些子与#开始,从我的短语*结束。

"#GUPW*"
"#WERTY*"
"#LLOPPPPER*"

+0

'indexOf'时没有更多的参数调用总是从字符串的开头searchs。所以它总是会找到“#GUPW” – Clayn

+0

但这并不明确。您正在遍历每个字符,但每次都从头开始使用indexOf方法。如果你这样迭代,检查当前字符,如果它是'#'或不。或者只是搜索每个'#'并做你自己的事情。 PS:你的例子不正确,因为你缺少'*',或者我不明白 – AxelH

+0

问自己,为什么你在循环中有y变量?你没有在任何地方使用它?你希望从程序中获得独特的phrase.length()打印输出吗?进一步的提示: - 使用while循环,将索引存储到变量中,以便您可以在更多的子字符串调用中使用它们,并阅读有关2参数indexOf方法的文档。 –

回答

2

的解决方案将是,以限定Pattern,然后在Matcher使用它。

List<String> allMatches = new ArrayList<String>(); 
Pattern p = Pattern.compile("#[^*]+\\*"); 
Matcher m = p.matcher(yourString); 
while (m.find()) { 
    allMatches.add(m.group()); 
} 

然后,所有的匹配将出现在List

演示:

String s = "R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW"; 
List<String> allMatches = new ArrayList<String>(); 
Pattern p = Pattern.compile("#[^*]+\\*"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    allMatches.add(m.group()); 
} 

for (String str : allMatches) { 
    System.out.println(str); 
} 
>>#GUPW* 
>>#WERTY* 
>>#LLOPPPPER* 
+1

I正在等待一个'Pattern'来询问'#foo * bar * boo'时会附加什么。有疑问的是,我使用了更多的_manual_解决方案 – AxelH

+0

@AxelH的好处。上面的解决方案会拍照。我相信这是OP想要的。 – xenteros

+0

由于没有提出这个问题,我没有把它作为一个要求。我不确定这会输出什么。感谢你的回答! – AxelH

0

已经有一个内部的Apache共享库,会替你在字符串utils的方法。该方法是StringUtils。 substringsBetween

公共静态字符串[] substringsBetween(字符串str, 字符串打开, 字符串靠近)搜索由开始和结束标签界定的子串,返回所有匹配 子阵列中的一个字符串。

null输入字符串返回null。 null null/close返回null(不匹配 )。空(“”)open/close返回null(不匹配)。

StringUtils.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"] 
StringUtils.substringsBetween(null, *, *)   = null 
StringUtils.substringsBetween(*, null, *)   = null 
StringUtils.substringsBetween(*, *, null)   = null 
StringUtils.substringsBetween("", "[", "]")   = [] 

参数:

  • STR - 包含的子串,空返回NULL,空返回空
  • 开放字符串 - 字符串识别子串的开始,空返回null关闭 - 标识
  • 的字符串结束 - 子字符串,空返回null返回:字符串子串的数组,如果不匹配,则返回null

此方法不包括在输出中分隔,所以如果你真的需要它,我想你需要修复与几行代码的行为。

+0

这是使用Apache API。你应该指定它;)不是每个人都使用它(我从来没有这样的需求) – AxelH

+0

@AxelH ApacheCommons以及番石榴通常在创建POM时添加到项目中:) – xenteros

+0

我可以同意,永远不会增加需求我不能判断;)但这需要在他的回答中。是的,这是链接,但这不是新手必须清楚。 (PS,而不是downvoter,我发现这个解决方案很有用,但不完整) – AxelH

0

尝试循环内的代码更改为

int stIndex = phrase.indexOf("#"); 
int endIndex = phrase.indexOf("*"); 
found = found + "\n" + phrase.substring(stIndex, endIndex); 
phrase = phrase.substring(endIndex + 1); 

我所做的是找到后的首场比赛,我除去输入匹配的字符串。

1

我会简单地搜索每个*,然后从这个位置找到以前的#(如果有的话)。这应该是这样的:

String input = "R#test*foo#bar#far#bor*for#"; 

int index = -1, begin; 
while((index = input.indexOf("*", index+1)) > -1){ 
    if((begin = input.lastIndexOf("#", index)) > -1){ //If there is a character 
      // Substract it from the current String 
      System.out.println(input.substring(begin, index + 1)); 
     } 
} 

基本上,寻找下一个*index + 1开始(+ 1,以防止无限循环)与

input.indexOf("*", index+1)) 

从那里,只需使用String.lastIndexOf从这个搜索放置之前的#。如果子字符串中有两个*,则此解决方案将同时打印这两个文件。

这个输出:

#test 
#bor 
+0

你的输出是错误的......并根据你对多颗星的怀疑。看,OP有三颗星,期望3个输出,而不是6. – xenteros

+0

@xenteros我的输出确实缺少'*'。但是,这个输出与OP示例完全相同的字符串....所以是的,这可能是错误的'#foo * bar * far'应该只输出一个字符串,但这很容易修复(如果需要) – AxelH

-2
String phrase = "R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW"; 
    String[] ph = phrase.substring(phrase.indexOf("#"), phrase.lastIndexOf("*")+1) //get everything between the first "#" and last "*"       
         .replaceAll("\\*.*?#", "*#") // remove all chars between * and # 
         .split("(?<=\\*)"); //split at * and keep the delimiter 
    System.out.println(Arrays.toString(ph)); 
相关问题