Java 用于替换特定子字符串前后的特定字符的正则表达式

Java 用于替换特定子字符串前后的特定字符的正则表达式,java,regex,string,Java,Regex,String,我正在进行Java编码BAT练习。是我刚刚完成的一个: 给定一个字符串和一个非空的单词字符串,返回一个由每个字符组成的字符串,该字符恰好位于字符串中单词的每个外观之前和之后。忽略单词前后没有字符的情况,如果字符位于两个单词之间,则可能包含两次字符 我的代码,有效: public String wordEnds(String str, String word){ String s = ""; String n = " " + str + " "; //To avoid OOB e

我正在进行Java编码BAT练习。是我刚刚完成的一个:

给定一个字符串和一个非空的单词字符串,返回一个由每个字符组成的字符串,该字符恰好位于字符串中单词的每个外观之前和之后。忽略单词前后没有字符的情况,如果字符位于两个单词之间,则可能包含两次字符

我的代码,有效:

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;
}
publicstringwordends(stringstr,stringword){
字符串s=“”;
字符串n=“”+str+”;//以避免OOB异常
int sL=str.length();
int-wL=单词长度();
int nL=n.长度();
int i=1;
而(i

我的问题是关于正则表达式的。我想知道上述内容是否可以通过正则表达式实现,如果可以,如何实现?

要在一个字符串在另一个字符串中每次出现之前和之后获取包含该字符的字符串,可以使用正则表达式:

"(^|.)" + 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;
}
试试这个。只需抓取捕获并删除
值。请参阅演示


您可以使用Java正则表达式对象
模式
匹配器
来执行此操作

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

    }
} 
子字符串前后的公共类字符{
公共静态字符串wordEnds(字符串str、字符串word){
java.util.regex.Pattern p=java.util.regex.Pattern.compile(word);
java.util.regex.Matcher m=p.Matcher(str);
StringBuilder beforeAfter=新建StringBuilder();
for(int startIndex=0;m.find(startIndex);startIndex=m.start()+1){
如果(m.start()-1>-1)
append(Character.toChars(str.codepoint(m.start()-1));
如果(m.end()
这个问题可能很难用Java正则表达式解决,因为匹配可能会重叠,例如
abcxyijk
上的
XY
匹配将
cXY1
1XYi
作为组。顺便说一句,很好的问题是^^添加一些输入和预期输出f-16是可变宽度,而不是固定宽度。每个字符占用一个或两个代码单元。因此,
chatAt
是错误的。它如何
返回一个由每个字符组成的字符串,该字符串在单词出现在字符串中之前和之后
。你是对的。我是在替换而不是只返回那些字符,这与要求的相反。更新了答案。您的代码未通过OP试图学习的大多数测试。@user883499更新了表达式中的逻辑。这没有考虑到
XY
可能是其他东西,如问题中
str
所定义的。我理解问题的“可能是”部分不明确。在这种情况下,应将其包括在内,否则测试将被取消failed@alanbuchanan编辑了答案,请查看。增加了一点索引逻辑,以确保正确计算重叠。这在16/17感谢平面@tchrist中不起作用。赔礼道歉。这是一个初学者的问题,所以对于unicode没有太多的麻烦。
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));

    }
}