如何抓取两个相同字符之间的字符串

时间:2016-11-06 18:43:10

标签: java regex string

我试图创建一个程序,如果给它带有两个破折号的字符串,则返回前两个破折号之间的文本。如果它没有至少两个破折号,则返回它不存在。防爆。我有一个字符串

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 AM -VERY- HUNGRY放入此代码中,它将返回VERY- HUNGRY。我怎样才能这样做才能抓住文本直到第二个破折号?

6 个答案:

答案 0 :(得分:4)

您可以使用以下行:

var config = new MapperConfiguration(cfg => {
    cfg.AddProfile(new MyConfig());
});
var mapper = config.CreateMapper();
services.AddSingleton(mapper);

或者使用正则表达式。请参阅Regex101的具体正则表达式的链接。

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

符合以下条件:

  • -(\w+)- 表示至少有一次\w+字母。
  • +正在捕获群组
  • ()捕获-(\w+)-个字符
  • 之间的一个或多个字母

结合-Pattern来实现结果。

Matcher

答案 1 :(得分: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");
}

答案 2 :(得分:1)

只需使用String的方法拆分。 See API here。使用字符串“ - ”作为分隔符,如果结果数组的长度为3或更多,那么您的第二个Array成员就是结果:

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;
}

如果未找到模式,则“else”块有效。所以在这种情况下,异常被抛出作为不匹配的指示符,而不是返回一个可能与实际结果混淆的String。 (假设您的arg String是“Hello -no matches found-bye”。在这种情况下,String “找不到匹配项”将是您的实际结果)。因此,抛出Exception,您可以在调用代码中捕获它,并以任何方式将其作为错误处理。

答案 3 :(得分:0)

您需要使用indexOf来获取第一个连字符的索引,并使用lastIndexOf来获取最后一个连字符的索引。所以也许是这样的:

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

(注意:此代码尚未经过测试,不包括您提到的错误检查类型。)

答案 4 :(得分:0)

一线解决方案......

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

答案 5 :(得分:0)

如果字符串格式一致-里面总是有两个连字符,并且里面有一个值-您可以将.replaceFirst^[^-]*-(.*)-[^-]*$的正则表达式和{{1 }}替换模式中的占位符:

$1

请参见regex demoJava demo

详细信息

  • String s = "I AM -VERY- HUNGRY" String result = s.replaceFirst("(?s)^[^-]*-(.*)-[^-]*$", "$1"); -DOTALL修饰符
  • (?s)-字符串的开头
  • ^-除[^-]*以外的0个字符
  • --连字符
  • --第1组(替换模式中用(.*)表示)-尽可能多的0个字符
  • $1-连字符
  • --除[^-]*以外的0个字符
  • --字符串的结尾。

如果可以有任何类型的连字符,请在代码中使用$而不是\\p{Pd}