Java 如何从字符串中提取短语

Java 如何从字符串中提取短语,java,regex,Java,Regex,我怎样才能把这两个词的“16”都去掉呢 酒吧Foo酒吧:Foo8:16 Foo酒吧Foo酒吧 8:16福吧福吧 这是我试过的 String V,Line ="Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz"; V = Line.substring(Line.indexOf("([0-9]+:[0-9]+)+")+1); V = V.substring(V.indexOf(":")+1, V.indexOf(" ")); System.out.println

我怎样才能把这两个词的“16”都去掉呢

  • 酒吧Foo酒吧:Foo8:16 Foo酒吧Foo酒吧
  • 8:16福吧福吧
这是我试过的

String V,Line ="Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz";
V = Line.substring(Line.indexOf("([0-9]+:[0-9]+)+")+1);
V = V.substring(V.indexOf(":")+1, V.indexOf(" "));
System.out.println(V);
这是我得到的错误

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    at java.lang.String.substring(String.java:1955)  
    at Indexing.Index(Indexing.java:94)  
    at Indexing.main(Indexing.java:24)

我在测试了正则表达式(([0-9]+:[0-9]+)+),它正确地突出显示了“8:16”

您需要将捕获组放置在第二个
[0-9]+
(或等效的
\d+
)上,并使用:

String value1 = "Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz";
String pattern1 = "\\d+:(\\d+)"; // <= The first group is the \d+ in round brackets
Pattern ptrn = Pattern.compile(pattern1);
Matcher matcher = ptrn.matcher(value1);
if (matcher.find())
    System.out.println(matcher.group(1)); // <= Print the value captured by the first group
else
    System.out.println("false");
String value1=“Bar-Foo-Bar:Foo8:16 Foo-Bar-Foo-barz”;
字符串模式1=“\\d+:(\\d+)”// indexOf(String str)不接受正则表达式。它需要一根绳子

您可以简单地执行以下操作:

String V, Line = "Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz";
V = Line.substring(Line.indexOf("16"), Line.indexOf("16") + 2);
System.out.println(V);
或者,为了使其看起来更整洁,您可以替换此行:

V = Line.substring(Line.indexOf("16"), Line.indexOf("16") + 2);
与:


输出期望是什么?您需要使用Java正则表达式库进行列表类型的搜索。您不能只使用正则表达式执行
indexOf
。函数不接受正则表达式16是预期的输出。很好的答案。这是最安全的方法。matcher.find()返回false时会出现什么错误?如果模式与输入字符串中的任何位置不匹配,则返回的结果为false。实际上,在大多数情况下,
else
语句被省略了,我只是为了代码的完整性而添加了它。你们在兜圈子。顺便说一句,我不知道“16”或“8”的值。只有在中间有一个冒号,并且可以在iTIF周围有更多的冒号。这个值被存储在一个变量中,你可以做同样的事情,除了你会这样做:Lo.NoxOf(Strord.ValueOf(value));我到底是怎么循环的?因为如果我们知道
value
是什么,那么我们就可以做
V=value
足够公平了,所以你想找到紧跟在后面的字符串:?1,2,3-但它可能是2的第2个“:”或8的第5个,IDK,但它前后都有1-3个数字。
int index = Line.indexOf("16");
V = Line.substring(index, index + 2);