gpt4 book ai didi

java - 查找包含在定界符中的字符串部分

转载 作者:行者123 更新时间:2023-11-29 03:27:20 26 4
gpt4 key购买 nike

假设我有一个像这样的 String:

String s="social network such as '''[http://www.facebook.com Facebook]''' , "+
"'''[http://www.twitter.com Twitter]''' and '''[http://www.tumblr.com tumblr]'''";

我只需要检索 '''[]''' 中的那些 String

示例输出:

http://www.facebook.com Facebook, http://www.twitter.com Twitter, http://www.tumblr.com   tumblr

我在使用 regex 时遇到困难,所以我使用 recursion 想到了这个想法:

System.out.println(filter(s, "'''[",  "]'''"));
....

public static String filter(String s, String open, String close){
int start = s.indexOf(open);
int end = s.indexOf(close);

filtered = filtered + s.substring(start + open.length(), end) + ", ";
s = s.substring(end + close.length(), s.length());

if(s.indexOf(open) >= 0 && s.indexOf(close) >= 0)
return filter(s, open, close);

else
return filtered.substring(0, filtered.length() - 2);
}

但在某些情况下,我需要在 String 的相同模式中检索单词,例如 '''''',它会说 String index out of range 因为 startend 将保持相同的值。

我该如何克服这个问题? regex 是唯一的解决方案吗?

最佳答案

Regex 是执行此操作的合适工具。使用 PatternMatcher .

public static String filter(String s, String open, String close){
Pattern p = Pattern.compile(Pattern.quote(open) + "(.*?)" + Pattern.quote(close));
Matcher m = p.matcher(s);

StringBuilder filtered = new StringBuilder();

while (m.find()){
filtered.append(m.group(1)).append(", ");
}
return filtered.substring(0, filtered.length() - 2); //-2 because trailing ", "
}

Pattern.quote确保 openclose 的任何特殊字符都被视为常规字符。

m.group() 返回与 m.find() 匹配的最后一个 String 的组。

m.find() 查找与正则表达式匹配的所有子字符串。


非正则表达式解决方案:

注意:在这两个中,end 都被分配了 s.indexOf(close, start + 1),使用 String#indexOf(String, int)StringBuilder#indexOf(String, int)这样即使 openclose 值相同,也不会发生错误。

递归:

public static String filter(String s, String open, String close){
int start = s.indexOf(open);
int end = s.indexOf(close, start + 1);

//I took the liberty of adding "String" and renaming your variable
String get = s.substring(start + open.length(), end);
s = s.substring(end + close.length());

if (s.indexOf(open) == -1){
return get;
}
return get + ", " + filter(s, open, close);
}

与其立即添加 ", " ,不如稍后处理它更容易一些。另外,请注意 s.substring(end + close.length(), s.length())s.substring(end + close.length()); 此外,我觉得查看 s.indexOf(...) == -1 是否比检查 >=0 更简洁。

真正的问题在于您对待 filtered 的方式。首先,您需要将 filtered 声明为 String 类型。接下来,由于您正在进行递归,因此不应连接到 filtered。这将使我们首先看到 filtered 的行:String filtered = s.substring(start + open.length(), end) + ", ";。如果您修复了该行,您的解决方案就会起作用。

迭代:

public static String filter(String str, String open, String close){
int open_length = open.length();
int close_length = close.length();

StringBuilder s = new StringBuilder(str);
StringBuilder filtered = new StringBuilder();

for (int start = s.indexOf(open), end = s.indexOf(close, start + 1); start != -1;
start = s.indexOf(open), end = s.indexOf(close, start + 1)){
filtered.append(s.substring(start + open_length, end)).append(", ");
s.delete(0, end + close_length);
}

return filtered.substring(0, filtered.length() - 2); //trailing ", "
}

此迭代方法使用了 StringBuilder,但没有它也可以完成同样的操作。它生成两个 StringBuilder,一个是空的,另一个保存原始 String 的值。在 for 循环中:

  • int start = s.indexOf(open), end = s.indexOf(close) 获取对索引的引用
  • start != -1 如果 s 不包含 open
  • 则结束循环
  • start = s.indexOf(open), end = s.indexOf(close) 在每次循环迭代后,再次找到索引。

循环内部将正确的子字符串附加到 finished 并从另一个 StringBuilder 中删除附加部分。

关于java - 查找包含在定界符中的字符串部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com