我试图创建一个程序,如果给它带有两个破折号的字符串,则返回前两个破折号之间的文本。如果它没有至少两个破折号,则返回它不存在。防爆。我有一个字符串
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
。我怎样才能这样做才能抓住文本直到第二个破折号?
答案 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 demo和Java demo。
详细信息
String s = "I AM -VERY- HUNGRY"
String result = s.replaceFirst("(?s)^[^-]*-(.*)-[^-]*$", "$1");
-DOTALL修饰符(?s)
-字符串的开头^
-除[^-]*
以外的0个字符-
-连字符-
-第1组(替换模式中用(.*)
表示)-尽可能多的0个字符$1
-连字符-
-除[^-]*
以外的0个字符-
-字符串的结尾。如果可以有任何类型的连字符,请在代码中使用$
而不是\\p{Pd}
。