2016-11-06 37 views
2

我想做一个程序,如果给定的字符串中有两个破折号,返回前两个破折号之间的文本。如果它没有至少两个破折号,它将返回它不存在。防爆。我有一个字符串如何抓住两个相同的字符之间的字符串

String s = "I AM -VERY- HUNGRY" 

而我希望我的程序返回非常,这是两个破折号之间。这是我的代码到目前为止

public static String middleText(String sentence) 
    { 
    int count = 0; 
    for (int i = 0; i < sentence.length(); i++) 
    { 
    if (sentence.charAt(i) == '-') 
    { 
     count++; 
    } 
    } 
    if (count >= 2) 
    { 
    return sentence.substring(sentence.indexOf("-") + 1); 
    } 
    else 
    { 
    return "DOES NOT EXIST"; 
    } 
} 

但是,此代码不会产生我所需的输出。如果我把这个字符串“I-HUNY-HUNGRY”放到这段代码中,它会返回“非常饥饿”。我怎样才能做到这一点,所以它只抓住文字直到第二个破折号?

+0

跟踪在该指数的特点是 - 。然后,在这些数字之间取一个子串... – Li357

+0

'sentence.indexOf(“ - ”)'返回第一个“ - ”和“substring”的位置,只有一个参数给出从该位置开始直到结束的字符串。 – Sentry

+0

提示:当事情正常时,你的方法应该返回一个** String **。所以返回一个String **错误**信息实在是一个坏主意!使用该方法的代码将不得不检查返回的字符串是否不存在来确定发生了什么。不好的风格! – GhostCat

回答

4

您可以使用下面的一行:

return sentence.substring(sentence.indexOf("-")+1, sentence.lastIndexOf("-")); 

另外也可以使用正则表达式。请参阅Regex101的具体正则表达式的链接。

-(\w+)- 

它匹配以下:

  • \w+指任何字母至少一个时间+
  • ()是捕获组
  • -(\w+)-捕获-字符

联合PatternMatcher之间的一个或多个字母,以实现的结果。

public static String middleText(String sentence) { 
    Pattern pattern = Pattern.compile("-(\w)-"); 
    Matcher matcher = pattern.matcher(sentence); 
    if (matcher.find()) { 
     return matcher.group(1); 
    } else { 
     return "DOES NOT EXIST"; 
    } 
} 
+1

您是否打算调用'find()'?否则,它只会在字符串开始并以破折号结束时起作用。 – Andreas

+0

是的,我的意思是'find()'。我很抱歉,谢谢你的编辑。 –

1

您可以使用Pattern和Matcher(java.util.regex包)此

String s = "I AM -VERY- HUNGRY"; 
Pattern patter = Pattern.compile("-(.*)-"); 
Matcher matcher = patter.matcher(s); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); // VERY 
} else { 
    System.out.println("no match"); 
} 
+0

如果您使用'find()',则在开始和结束时不需要'。*'。这也更直观,因为你真的试图找到破折号之间的文本。 – Andreas

+0

谢谢@Andreas编辑它 – baao

0

你将要使用indexOf拿到第一个连字符的索引,并lastIndexOf获得指数最后一个。因此,也许是这样的:

int firstIndex = sentence.indexOf("-"); 
int lastIndex = sentence.lastIndexOf("-"); 
return sentence.substring(firstIndex+1, lastIndex); 

(注:此代码没有经过测试,并且不包括那种错误检查你所提到的)

1

只需使用字符串的方法拆分。 See API here。使用字符串“ - ”作为分隔符,并且如果你的所得阵列具有长度3或更那么你的阵列的第二成员是你的结果:

public String myMatchFinder(String arg) { 
    String result = null; 
    String res[] = arg.split("-", 3); 
    if(res.length == 3) { 
     result = res[1]; 
    } else { 
     throw new RuntimeException("No matches found"); 
    } 
    return result; 
} 

如果没有模式被发现的“其他”块的工作原理。所以在这种情况下,抛出异常作为不匹配的指示符,而不是返回一个可能被实际结果混淆的String。 (说你的ARG字符串是“你好,没有匹配找到了再见”。在这种情况下字符串“找不到匹配”将是你的实际结果)。所以在抛出Exception的时候,你可以在你的调用代码中捕获它,并以任何你喜欢的方式将它作为错误处理。

+0

这只是一个新手的简单示例。所以它会很清楚。我当然不会把它写成真正的代码。我也(几乎)在同一个方法中从来没有多个回报,但这又是一个快速和肮脏的演示。因此,从技术上讲,你是正确的,但你只是在细节选择,而原则解决方案是正确的,并在视觉上演示 –

+0

好的,这是更好的,我同意 –

+0

只剩下一件事 - 那封邮件中有一个错字。你应该*解释*该块还在做什么。 – GhostCat

0

而且一条线解决方案......

return Optional.of(sentence) 
    .map(Pattern.compile("(?<=-).*?(?=-)")::matcher) 
    .filter(Matcher::find) 
    .map(Matcher::group) 
    .orElse("DOES NOT EXIST"); 
相关问题