我正在进行Java CodingBat练习。 Here是我刚刚完成的那个:
给定一个字符串和一个非空字符串,在字符串中每次出现单词之前和之后返回由每个char组成的字符串。忽略单词之前或之后没有字符的情况,如果字符位于两个单词之间,则可以包含两次字符。
我的代码,有效:
public String wordEnds(String str, String word){
String s = "";
String n = " " + str + " "; //To avoid OOB exceptions
int sL = str.length();
int wL = word.length();
int nL = n.length();
int i = 1;
while (i < nL - 1) {
if (n.substring(i, i + wL).equals(word)) {
s += n.charAt(i - 1);
s += n.charAt(i + wL);
i += wL;
} else {
i++;
}
}
s = s.replaceAll("\\s", "");
return s;
}
我的问题是关于正则表达式。我想知道以上是否可以使用正则表达式语句,如果是,那怎么办?
答案 0 :(得分:3)
您可以使用Java正则表达式对象Pattern
和Matcher
来执行此操作。
public class CharBeforeAndAfterSubstring {
public static String wordEnds(String str, String word) {
java.util.regex.Pattern p = java.util.regex.Pattern.compile(word);
java.util.regex.Matcher m = p.matcher(str);
StringBuilder beforeAfter = new StringBuilder();
for (int startIndex = 0; m.find(startIndex); startIndex = m.start() + 1) {
if (m.start() - 1 > -1)
beforeAfter.append(Character.toChars(str.codePointAt(m.start() - 1)));
if (m.end() < str.length())
beforeAfter.append(Character.toChars(str.codePointAt(m.end())));
}
return beforeAfter.toString();
}
public static void main(String[] args) {
String x = "abcXY1XYijk";
String y = "XY";
System.out.println(wordEnds(x, y));
}
}
答案 1 :(得分:1)
要在另一个字符串中每次出现之前和之后获取包含字符的字符串,可以使用正则表达式:
"(^|.)" + str + "(.|$)"
然后你可以遍历这些组并连接它们。
此表达式将查找(^|.)
,字符串^
的开头或任何字符.
,后跟str
值,然后是(.|$)
,任何字符.
或字符串$
的结尾。
您可以尝试这样的事情:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public String wordEnds(String str, String word){
Pattern p = Pattern.compile("(.)" + str + "(.)");
Matcher m = p.matcher(word);
String result = "";
int i = 0;
while(m.find()) {
result += m.group(i++);
}
return result;
}
答案 2 :(得分:1)